错误C2003:预期'定义的id'

时间:2014-11-16 12:16:54

标签: c c-preprocessor

我建立了一种机制,通过定义宏来仅从一系列测试中编译选定的测试:

#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(或两者)时才会收到错误。

3 个答案:

答案 0 :(得分:1)

SELECTION的替代定义:

#ifdef RUN_SELECTED_TESTS_ONLY
    #define SELECTION defined
#else
    #define SELECTION(x) 1
#endif

注意:

  • 必须在 RUN_SELECTED_TESTS_ONLY之后定义
  • 仅适用于GNU cpp和其他预处理器similarly permissive,关于运算符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;
}