我建立了一种机制,通过定义宏来仅从一系列测试中编译选定的测试:
#define SELECTION(x) ((!defined (RUN_SELECTED_TESTS_ONLY)) || (defined (x)))
#define RUN_SELECTED_TESTS_ONLY
#define TEST_1 //Lets say I want only test1 to be compiled
#if SELECTION(TEST_1) //The line I'm getting the error on.
//code of test 1
#endif
#if SELECTION(TEST_2)
//code of test 2
#endif
编译时我收到错误:
错误C2003:预期'已定义ID'
我只有在定义了TEST_1或TEST_2(或两者)时才会收到错误。
答案 0 :(得分:1)
SELECTION
的替代定义:
#ifdef RUN_SELECTED_TESTS_ONLY
#define SELECTION defined
#else
#define SELECTION(x) 1
#endif
注意:
RUN_SELECTED_TESTS_ONLY
之后定义。defined
是宏扩展的结果。示例:
#define RUN_SELECTED_TESTS_ONLY
#ifdef RUN_SELECTED_TESTS_ONLY
#define SELECTION defined
#else
#define SELECTION(x) 1
#endif
#define TEST_1
//#define TEST_2
#include <stdio.h>
int main()
{
#if SELECTION(TEST_1)
printf("Test 1\n");
#endif
#if SELECTION(TEST_2)
printf("Test 2\n");
#endif
return 0;
}
输出:
Test 1
答案 1 :(得分:1)
您调用的内容未定义的行为。 C标准表示已定义的预处理程序运算符可能不会因替换而出现。
C11草案,6.10.1条件包含
4评估之前,预处理列表中的宏调用 将成为控制常量表达式的标记是 替换(除了由定义的一元修改的那些宏名称 运算符),就像在普通文本中一样。 如果生成了令牌定义 由于这个替换过程或使用定义的一元 运算符与宏之前的两个指定表单中的一个不匹配 替换,行为未定义。经过所有替换后 已经执行了宏扩展和定义的一元运算符, 所有剩余的标识符(包括那些词汇上相同的标识符) 关键字)替换为pp-number 0,然后各自 预处理令牌将转换为令牌。
如果您无法在运行时执行相同检查,则可以执行以下操作:
#define RUN_SELECTED_TESTS_ONLY
#define TEST_1
#if ((!defined (RUN_SELECTED_TESTS_ONLY)) || (defined (TEST_1)))
//code of test 1
#endif
基本上执行&#34;选择&#34;自己。
答案 2 :(得分:0)
您获得的错误意味着:标识符必须遵循预处理程序关键字。(来自MSDN)。
它不起作用,因为您在宏defined()
中无法SELECTION(x)
2次。
你可以做的是:
#define SELECTION(x) (!RUN_SELECTED_TESTS_ONLY || x)
#define RUN_SELECTED_TESTS_ONLY 1
#define TEST_1 1
#define TEST_2 0
#if SELECTION(TEST_1)
//some code
#endif
int main() {
printf("%d\n", SELECTION(TEST_1));
printf("%d\n", SELECTION(TEST_2));
return 0;
}