gpt4 book ai didi

c - 间接预处理器替换 C

转载 作者:行者123 更新时间:2023-12-02 08:36:14 26 4
gpt4 key购买 nike

有没有办法让宏可以使用传递给它的定义值,而不是定义文本本身?

这是一个奇怪的例子,我预计预处理器可以实现。

一个名为 test.cC 文件,它包含两次自身以定义两个从 main 调用的不同函数。

#ifndef IS_INDIRECT
#define IS_INDIRECT

/* int */
#define NUMTYPE int
#define PREFIX int_

#include "test.c"

#undef NUMTYPE
#undef PREFIX

/* short */
#define NUMTYPE float
#define PREFIX float_

#include "test.c"

#undef NUMTYPE
#undef PREFIX

#include <stdio.h>

int main(int argc, const char **argv)
{
printf("test int %d\n", int_squared(4));
printf("test float %f\n", float_squared(2.5));

return 0;
}

#else

/* function body */

#define fn(prefix, id) prefix ## id

NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
{
return val * val;
}

#endif

出现以下错误:

In file included from test.c:18:0:
test.c:37:12: error: conflicting types for 'PREFIXsquared'
NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
^
test.c:35:24: note: in definition of macro 'fn'
#define fn(prefix, id) prefix ## id
^
In file included from test.c:9:0:
test.c:37:12: note: previous definition of 'PREFIXsquared' was here
NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
^
test.c:35:24: note: in definition of macro 'fn'
#define fn(prefix, id) prefix ## id

我想让宏将 PREFIX 扩展为它定义的值,所以我得到 int_squared 而不是 PREFIXsquared

最佳答案

是不是您要找的东西?

#define xxx(x,y)   x##y
#define CONCAT(x, y) xxx(x, y)


#define function(type, operation, prm) type CONCAT(operation, type) (type prm)

function (int, square_, value) // int square_int (int value)
{
return value * value;
}

## 的间接使用允许定义一个使用串联的宏(在我们的示例中为 function)。当定义宏时,CONCAT展开为xxx
并在宏被调用时解析为 x##y

编辑:感谢各种贡献者:

  • ## 称为标记粘贴运算符,有时也称为标记连接运算符
  • 关于 C/C++ 预处理器的更详细解释 arguments prescan
  • 一个interesting blog article关于这个问题
  • 如果您仔细研究 ISO 人员添加的令人难以置信的模糊和任意保留标识符列表(您将不得不吐出 about $200 以获得真正的规范,或求助于 second hand information,或询问您最喜欢的guru for that bit of lore),你最终会注意到它包括那些以单个下划线和两个或更多下划线开头的,所以我的“_CONCAT”变成了“xxx”。

坦率地说,他们把 C 搞得一团糟,我再也不敢在专业环境中使用这门语言了。我很高兴我的 IT 时代结束了。

关于c - 间接预处理器替换 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21175081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com