NEP 2 — 一项在没有警告的情况下构建 numpy 并带有一大组警告标志的提案#
- 作者:
大卫·库纳波
- 接触:
- 日期:
2008-09-04
- 地位:
延期
执行摘要#
在构建 numpy 和 scipy 时,我们仅限于一组相当有限的警告编译器,因此错过了一大类可以通过更强的警告标志检测到的潜在错误。该 NEP 的目标是提供用于清理代码的各种方法并实施一些策略,以使 numpy 可使用更大的警告标志集进行构建,同时保持构建警告免费。
警告标志#
每个编译器都会检测到一组不同的潜在错误。基线将是 gcc -Wall -W -Wextra。理想情况下,一套完整的就更好了:
-W -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return
-Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast
-Wwrite-strings "
Intel 编译器、VS with 、Sun 编译器也有额外的警告。/W3 /Wall
警告类型#
C Python 扩展代码往往会自然地生成大量虚假警告。目标是拥有一些工具来标记一些典型的 C-Python 代码,以便编译器在这些情况下不会生成警告;标签过程必须干净、可读且健壮。特别是,它不应该使代码变得更加晦涩或更糟,破坏工作代码。
未使用的参数#
这种情况经常出现:任何 python 可调用的 C 函数都带有两个参数,其中第一个参数不用于函数(仅用于方法)。解决该问题的一种方法是使用宏 NPY_UNUSED 标记函数参数。该宏使用编译器特定的代码来标记变量,并对其进行修改,以便一旦标记后就不可能意外使用它。
应用编译器特定选项的代码可以是:
#if defined(__GNUC__)
#define __COMP_NPY_UNUSED __attribute__ ((__unused__))
# elif defined(__ICC)
#define __COMP_NPY_UNUSED __attribute__ ((__unused__))
#else
#define __COMP_NPY_UNUSED
#endif
变量重整将是:
#define NPY_UNUSED(x) (__NPY_UNUSED_TAGGED ## x) __COMP_NPY_UNUSED
当应用于变量时,我们会得到:
int foo(int * NPY_UNUSED(dummy))
扩展到:
int foo(int * __NPY_UNUSED_TAGGEDdummy __COMP_NPY_UNUSED)
从而避免变量的任何意外使用。重整是纯 C 语言,因此是可移植的。每个变量的警告禁用是特定于编译器的。
有符号/无符号比较#
更棘手:并不总是清楚该做什么
半初始化结构#
只需将带有 NULL 的元素放入其中即可。