是否可以使用define的值作为标识符的一部分?

时间:2015-06-09 17:48:48

标签: c c-preprocessor

是否可以在标识符中包含预定义的ID?

标题:

/* myfile.h */
#define func MYID##_func
static void func() {}
#undef func

c文件:

/* myfile.c */
#define MYID FOO
#include "myfile.h"
#undef MYID

#define MYID BAR
#include "myfile.h"
#undef MYID

/* check the functions exist */
void main()
{
    FOO_func();
    BAR_func();
}

我的目标是创建两个函数:(FOO_funcBAR_func)。

我尝试编译上面的代码,并且函数被标识为MYID_func(由于其中有2个,因此失败)。

我能做到:

#define func FOO_func
#include "myfile.h"
#undef func

...但是当文件有很多标识符时,这种扩展不会很好,因为它们都必须先定义。

目标是在同一个C文件中多次包含文件时,能够避免命名冲突。

2 个答案:

答案 0 :(得分:4)

您可以使用几层宏来完成您想要的任务。

/* myfile.h */
#define CONCAT2(A, B) A ## B
#define CONCAT(A, B) CONCAT2(A, B)
#define func() CONCAT(MYID, _func)()
static void func() {}
#undef func

您需要额外的图层以确保将MYID扩展为宏。

答案 1 :(得分:2)

运营商##不要扩展宏。如果你想这样做,请使用额外的定义:

#define CONCAT_AUX(MACRO_ARG1, MACRO_ARG2) MACRO_ARG1 ## MACRO_ARG2
#define CONCAT(MACRO_ARG1, MACRO_ARG2) CONCAT_AUX(MACRO_ARG1, MACRO_ARG2)

#define func CONCAT(MYID, _func)