C 预处理器将源文本拆分为标记,只进行与这些标记匹配的扩展。通常这是预期的行为,但有时不是。
举个例子,我想以一种很好的方式实现一些类似模板的功能。通常它的实现方式如下:
#define add_function_template(mytype) \
mytype add_##mytype(mytype a, mytype b) { \
return a + b; \
}
连接运算符##
使这个扩展,但必须用反斜杠引用整个函数是非常麻烦的。是否有可能在宏体外部对函数名进行类似的扩展?
E.g。
之类的东西#define TYPENAME int
TYPENAME add_TYPENAME(TYPENAME a, TYPENAME b) {
return a + b;
}
标识符add_TYPENAME
未展开,其余为。不能如何扩展此类标识符?帮手宏也可以,但我找不到任何理智的方式......
答案 0 :(得分:4)
使用C预处理器无法执行此操作。预处理令牌(如add_TYPENAME
)无法拆分。最简单的“解决方案”有点难看:
#define CONCAT_IMPL(x, y) x ## y
#define CONCAT(x, y) CONCAT_IMPL(x, y)
#define MAKE_TYPENAME_FUNCTION_NAME(x) CONCAT(x, TYPENAME)
TYPENAME MAKE_TYPENAME_FUNCTION_NAME(add_)(TYPENAME a, TYPENAME b) {
必须用反斜杠引用整个函数是非常麻烦的
这可能很麻烦,但这是将预处理器用于任何重要事情的成本。
答案 1 :(得分:2)
你不能这样做。想想如何搞砸一个人的代码。
#define p f
printf()将扩展为frintf()
或#define . ,
依旧......
答案 2 :(得分:0)
如果你愿意从另一个.c文件#include .c文件,你可以实现你想要的。
以下是您将如何做的示例:
在 add_function_template.c:
#define add_function(t) t add_##t(t a, t b) // This line could be moved elsewhere.
add_function(mytype)
{
return a + b;
}
在 footype.c:
#define mytype footype
#include <add_function_template.c>