【问题标题】:How is the at sign (@) used in the c source code for numpy?numpy的c源代码中如何使用at符号(@)?
【发布时间】:2018-02-02 23:06:41
【问题描述】:

我一直在阅读一些 numpy 的源代码,我注意到很多 c 源代码都使用@variablename@ 的构造。例如,在文件“npy_math_complex.c.src”(位于here)中:

/*==========================================================
* 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@};

@ctype@@c@ 是什么意思?这些是某种宏吗?我猜它们不是普通的 C 宏,因为我查看了文件中列出的相关头文件,它们似乎没有使用“@”定义任何宏。

@name@distutils 在将 c 代码编译成 python 模块时使用的某种宏吗?

我以前从未在 c 代码中看到过 @ 符号,所以我有点困惑......

【问题讨论】:

  • 它被某种模板引擎用来生成多个非常相似的函数,并替换了@标记的部分,但我从未弄清楚他们使用的是什么模板系统或确切的细节生成什么代码。
  • 注意文件名npy_math_complex.c.src是一个线索......
  • numpy 文档在这里给出了一个非常简短的概述:numpy.org/devdocs/reference/distutils_guide.html#other-files

标签: python c numpy macros


【解决方案1】:

这是因为这些文件是模板。如果我没记错的话,NumPy 使用了多个模板引擎(感谢 @user2357112 帮助我找到合适的引擎):

第二个实际上负责将这些转换为“常规”C 文件 - 在编译之前。

基本上,这些函数会被克隆很多次,并且对于每个函数,都会在 % 之间插入一个特殊的占位符。

例如in this case it begins with:

/**begin repeat
 * #type = npy_float, npy_double, npy_longdouble#
 * #ctype = npy_cfloat,npy_cdouble,npy_clongdouble#
 * #c = f, , l#
 * #C = F, , L#
 * ....
 */

所以在第一次迭代中,@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};

在下一次迭代中是@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};

在第三次迭代中:

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};

然后将它们编译为普通的 C 文件。

【讨论】:

  • 我快速浏览了 tempita 用法的源代码,但它似乎只用于生成 Cython 文件,而不是 C。此外,语法似乎与 tempita 不匹配。 C 模板的处理方式似乎有所不同。
  • @user2357112 啊,可能是这样。我发现另一个文档明确提到了.xxx.src -> .xxx 转换:github.com/numpy/numpy/blob/… 但很难确定这是否真的在那里使用。但我确信一件事:他们使用模板引擎:D
  • 不,我认为那是另一个模板引擎。 .c.src 文件似乎由同名的 numpy/distutils/conv_template.py 处理。
  • (这个项目中的模板引擎比我预期的要多。)
  • 感谢您为我指明正确的方向!出于某种原因,我认为 disutils 正在替换...所以您为我节省了大量时间...
猜你喜欢
  • 2013-01-06
  • 2011-06-26
  • 2021-02-16
  • 1970-01-01
  • 2011-05-19
  • 2013-05-16
  • 2011-07-28
  • 2014-04-12
  • 2014-03-27
相关资源
最近更新 更多