是否可以将定义的值用作标识符的一部分?
Is it possible to use the value of a define as part of an identifier?
是否可以在标识符中包含 pre-defined id?
header:
/* 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();
}
我的目标是创建 2 个函数:(FOO_func
, BAR_func
).
我尝试编译上面的代码,函数被识别为 MYID_func
(因为有 2 个函数而失败)。
我能做到:
#define func FOO_func
#include "myfile.h"
#undef func
...但是当文件有很多标识符时,这并不能很好地扩展,因为它们都必须首先定义。
目标是在同一 C 文件中多次包含该文件时能够避免命名冲突。
您可以使用几层宏来完成您想要的。
/* 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
扩展为宏。
运算符## 不展开宏。如果你想这样做,请使用额外的定义:
#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)
是否可以在标识符中包含 pre-defined id?
header:
/* 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();
}
我的目标是创建 2 个函数:(FOO_func
, BAR_func
).
我尝试编译上面的代码,函数被识别为 MYID_func
(因为有 2 个函数而失败)。
我能做到:
#define func FOO_func
#include "myfile.h"
#undef func
...但是当文件有很多标识符时,这并不能很好地扩展,因为它们都必须首先定义。
目标是在同一 C 文件中多次包含该文件时能够避免命名冲突。
您可以使用几层宏来完成您想要的。
/* 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
扩展为宏。
运算符## 不展开宏。如果你想这样做,请使用额外的定义:
#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)