C preprocessor C宏中的宏展开
在测试C软件时,我想使用宏来生成函数调用。使用codewarrior 5.2(非常旧的)编译器-因为我没有选择,我不知道这是否是标准行为 在宏中C preprocessor C宏中的宏展开,c-preprocessor,C Preprocessor,在测试C软件时,我想使用宏来生成函数调用。使用codewarrior 5.2(非常旧的)编译器-因为我没有选择,我不知道这是否是标准行为 在宏中 #define RUNTEST(i) \ testcase_index = i; \ __PREFIX__##_testCase_##i() 在test_foo.c中 #include "macros.h" #define __PREFIX__ foo RUNTEST(1
#define RUNTEST(i) \
testcase_index = i; \
__PREFIX__##_testCase_##i()
在test_foo.c中
#include "macros.h"
#define __PREFIX__ foo
RUNTEST(10);
显然,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
复制同一文件中的所有内容似乎不会改变任何东西
有没有简单的办法
可供替代的
我还尝试了#define uuuu PREFIX_uuuuu()foo
来强制宏扩展。在这种情况下,它几乎可以工作,现在生成foo\u testcase\u 10()
(带空格),当然不会编译。我在这里对您的问题做了一个简化版本(没有指定测试用例索引):
.h
:
#define PASTER(x, y) x##_testCase_##y
#define EVAL(x, y) PASTER(x, y)
#define RUNTEST(i) EVAL(__PREFIX__, i)
.c
#define __PREFIX__ foo
// whatever
RUNTEST(1);
说明:
根据C标准:
6.10.3.1参数替换
在确定调用函数(如宏)的参数后,将进行参数替换。替换列表中的参数,除非前面有#或####预处理标记或后面有##预处理标记(请参见下文),否则在展开其中包含的所有宏后,将替换为相应的参数。在被替换之前,每个参数的预处理标记被完全宏替换,就好像它们构成了预处理文件的其余部分一样;没有其他预处理令牌可用
现在我们有了这个,我将介绍RUNTEST(1)
的扩展:
我在这里对您的问题做了一个简化版本(没有分配到testcase索引):
.h
:
#define PASTER(x, y) x##_testCase_##y
#define EVAL(x, y) PASTER(x, y)
#define RUNTEST(i) EVAL(__PREFIX__, i)
.c
#define __PREFIX__ foo
// whatever
RUNTEST(1);
说明:
根据C标准:
6.10.3.1参数替换
在确定调用函数(如宏)的参数后,将进行参数替换。替换列表中的参数,除非前面有#或####预处理标记或后面有##预处理标记(请参见下文),否则在展开其中包含的所有宏后,将替换为相应的参数。在被替换之前,每个参数的预处理标记被完全宏替换,就好像它们构成了预处理文件的其余部分一样;没有其他预处理令牌可用
现在我们有了这个,我将介绍RUNTEST(1)
的扩展:
可能是@HWalters的复制品我想你是对的。我试着写了一个答案,结果和另一个问题非常接近,可能是@HWalters的重复,我想你是对的。我试着写了一个答案,结果和另一个问题非常接近。我,吹毛求疵。。。调用RUNTEST(1)
时,第一步是a.s.(如6.10.3.1引用所示)。产生EVAL(\uuuuu前缀,1)
。然后在粘贴/严格化(此处没有)后,在重新扫描和进一步替换(6.10.3.4)期间扫描EVAL(\uuuuuu前缀\uuuuuu,1)
。仅供参考,吹毛求疵。。。调用RUNTEST(1)
时,第一步是a.s.(如6.10.3.1引用所示)。产生EVAL(\uuuuu前缀,1)
。然后在粘贴/字符串化(此处没有)后,在重新扫描和进一步替换(6.10.3.4)过程中扫描EVAL(_;u前缀_;,1)
。