C preprocessor C宏中的宏展开

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

在测试C软件时,我想使用宏来生成函数调用。使用codewarrior 5.2(非常旧的)编译器-因为我没有选择,我不知道这是否是标准行为

在宏中

#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)