如何在n代码的c源代码中使用at符号(@)?

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代码中使用过的符号,所以我有点困惑......

MSe*_*ert 6

这是因为这些文件是模板.如果我没记错,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文件.

  • 不,我认为这是另一个模板引擎.`.c.src`文件似乎由类似命名的[`numpy/distutils/conv_template.py`]处理(https://github.com/numpy/numpy/blob/b5cc18d1e45f39fe98a743b3b41b99c70681e51c/numpy/distutils/conv_template的.py). (3认同)