展开预处理程序令牌的一部分

时间:2011-04-10 22:36:01

标签: c c-preprocessor

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未展开,其余为。不能如何扩展此类标识符?帮手宏也可以,但我找不到任何理智的方式......

3 个答案:

答案 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>