For*_*ist 4 c python macros numpy
我一直在仔细阅读numpy的一些源代码,我注意到很多c源代码都使用了构造@variablename@.例如,在文件"npy_math_complex.c.src"(位于此处):
/*==========================================================
* Constants
*=========================================================*/
static const @ctype@ c_1@c@ = {1.0@C@, 0.0};
static const @ctype@ c_half@c@ = {0.5@C@, 0.0};
static const @ctype@ c_i@c@ = {0.0, 1.0@C@};
static const @ctype@ c_ihalf@c@ = {0.0, 0.5@C@};
Run Code Online (Sandbox Code Playgroud)
做什么@ctype@和@c@意味着什么?这些是某种宏吗?我猜他们不是普通的C-macro,因为我查看了文件中列出的相关头文件,他们似乎没有使用"@"定义任何宏.
将c代码编译成python模块时是否@name@使用某种宏distutils?
我以前从未见过@c代码中使用过的符号,所以我有点困惑......
这是因为这些文件是模板.如果我没记错,NumPy会使用几个模板引擎(感谢@ user2357112帮助我找到合适的模板引擎):
第二个实际上负责将这些转换为"常规"C文件 - 在这些文件被编译之前.
基本上这些函数将被克隆很多次,并且对于每个函数,在它们之间插入一个特殊的占位符%.
例如,在这种情况下,它开始于:
/**begin repeat
* #type = npy_float, npy_double, npy_longdouble#
* #ctype = npy_cfloat,npy_cdouble,npy_clongdouble#
* #c = f, , l#
* #C = F, , L#
* ....
*/
Run Code Online (Sandbox Code Playgroud)
因此,在第一次迭代@ctype@将被替换npy_cfloat,并@c@用f和@C@有F:
static const npy_cfloat c_1f = {1.0F, 0.0};
static const npy_cfloat c_halff = {0.5F, 0.0};
static const npy_cfloat c_if = {0.0, 1.0F};
static const npy_cfloat c_ihalff = {0.0, 0.5F};
Run Code Online (Sandbox Code Playgroud)
在下一次迭代中@ctype@ npy_cdouble,......
static const npy_cdouble c_1 = {1.0, 0.0};
static const npy_cdouble c_half = {0.5, 0.0};
static const npy_cdouble c_i = {0.0, 1.0};
static const npy_cdouble c_ihalf = {0.0, 0.5};
Run Code Online (Sandbox Code Playgroud)
在第三次迭代中:
static const npy_clongdouble c_1l = {1.0L, 0.0};
static const npy_clongdouble c_halfl = {0.5L, 0.0};
static const npy_clongdouble c_il = {0.0, 1.0L};
static const npy_clongdouble c_ihalfl = {0.0, 0.5L};
Run Code Online (Sandbox Code Playgroud)
然后将它们编译为普通的C文件.