这段C代码中的“@”符号是怎么回事?

jvlzgdj9  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(260)

我正在挖掘NumPy的核心,试图找出为什么它不适合我(64位CygwinWindows 8.1),我来到了this file
当编译命中rad2deg()函数(粘贴在下面)时,我得到一个segmentation fault。看看这个文件,代码中有大量的“@”符号。它 * 看起来 * 像某种通配符标记,或者预处理器标记,但我在任何地方都找不到有关它的任何信息。

#define LOGE2    NPY_LOGE2@c@
#define LOG2E    NPY_LOG2E@c@
#define RAD2DEG  (180.0@c@/NPY_PI@c@)
#define DEG2RAD  (NPY_PI@c@/180.0@c@)

@type@ npy_rad2deg@c@(@type@ x) {
    return x*RAD2DEG;
}`

代码中还有其他地方,编译器不会因'@'字符而阻塞。
有没有一个搜索词可以解释这一点?

0x6upsns

0x6upsns1#

好吧,我想明白了。
这是一些非标准的预处理器技巧,可能在为NumPy构建C代码的Python代码中实现。

/**begin repeat
 * #type = npy_float, npy_double, npy_longdouble#
 * #c = f, ,l#
 * #C = F, ,L#
 */

#define LOGE2    NPY_LOGE2@c@
#define LOG2E    NPY_LOG2E@c@
#define RAD2DEG  (180.0@c@/NPY_PI@c@)
#define DEG2RAD  (NPY_PI@c@/180.0@c@)

@type@ npy_rad2deg@c@(@type@ x)
{
    return x*RAD2DEG;
}

/**end repeat**/

它遍历代码,用注解块中的标记替换代码中的@包围的标记,生成三个几乎相同的代码块,操作不同的数据类型。
我怀疑segfault可能来自不正确的数据类型;我们会看到的。

相关问题