NEP 2 — 一项在没有警告的情况下构建 numpy 并带有一大组警告标志的提案#

作者

大卫·库纳波

接触

大卫@ar媒体京都-u .交流 J.P

日期

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 的元素放入其中即可。