在使用单元测试框架时,我遇到了一种我想测试宏参数的情况。FOO(x)
简单地说,我想将宏FOO(int)
扩展为.short
FOO(anything_else)
long
使用 C++ 模板,这当然不是问题。但在这里我需要一个真正的令牌替换,而不仅仅是一个typedef
. 即FOO(char) FOO(char) i;
应该是一个有效的定义,等于long long i;
。
在使用单元测试框架时,我遇到了一种我想测试宏参数的情况。FOO(x)
简单地说,我想将宏FOO(int)
扩展为.short
FOO(anything_else)
long
使用 C++ 模板,这当然不是问题。但在这里我需要一个真正的令牌替换,而不仅仅是一个typedef
. 即FOO(char) FOO(char) i;
应该是一个有效的定义,等于long long i;
。
据我所知,C 宏中唯一可用的类似字符串的操作是粘贴/连接标记(使用##
)和对它们进行字符串化(使用#
)。
我很确定您将获得的最接近的涉及列举如下可能性:
#define FOO(x) FOO__##x
#define FOO__int short
#define FOO__short long
#define FOO__long long
#define FOO__char long
// ... for each type you want to replace
灵感来自这个问题。
你想做的事情是不可能的。
宏由 c 预处理器评估,顾名思义,它在编译器运行之前运行。它还不知道您的符号类型是什么。
为什么不为在编译器评估时将其自身转换为正确事物的类型创建一个类。