NEP 2 — 建议在启用大量警告标志的情况下构建 NumPy 而不会产生警告#
- 作者:
David Cournapeau
- 联系方式:
- 日期:
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 编译器、带有 /W3 /Wall
的 VS、Sun 编译器也有额外的警告。
警告类型#
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 的元素放在其中。