C++ 宏#ifdef

RRR*_*RRR 0 c++ macros preprocessor

void testFunc();

int myval = 0;

int main()
{
    int a = 1;

    if (a > 0)
    {
        #define TEST1
        testFunc();
        #undef TEST1
    }

    int b = 2;
    if ( b > 0)
    {
        #define TEST2
        testFunc();
        #undef TEST2
    }

    std::cout << "val : " << myval << endl;

    getchar();

    return 0;
}


void testFunc()
{

#ifdef TEST1
#define HERE 1
#endif

#ifdef TEST2
#define HERE 2
#endif

#ifdef HERE
    myval = HERE;
#else
    myval = -1;
#endif

}
Run Code Online (Sandbox Code Playgroud)

如何在第一次调用 testFunc() 时将 HERE 的值打印为 1,然后在第二次调用时将 HERE 的值打印为 2。

使用我拥有的当前代码,正在打印的值是 -1。

ive*_*rss 6

您缺少的是预处理器指令在编译时间之前进行评估。

这意味着当预处理器解析您的代码时:

  1. 设置 TEST1
  2. 取消设置 TEST1
  3. 设置 TEST2
  4. 取消设置 TEST2
  5. 检查是否定义了 TEST1(不是)
  6. 检查是否定义了 TEST2(不是)
  7. 检查是否定义了 HERE(不是)

这意味着testFunc变成:

void testFunc() {
    myval = -1;
}
Run Code Online (Sandbox Code Playgroud)

然后,在此预处理之后,您的代码将被编译。

我会考虑使用预处理器以外的其他东西来完成您想要实现的目标。