C ++宏#ifdef

问题描述 投票:0回答:3
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

}

我在这里丢失了一些东西,当第一次调用testFunc()时,如何将HERE的值打印为1,然后在第二次调用时,将HERE的值打印为2。请帮忙。谢谢。

使用当前的代码,正在打印的值为-1。

c++ macros preprocessor
3个回答
2
投票

您缺少的是预处理程序指令在编译之前执行。

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

  1. Sets Test1

  2. 取消测试1

  3. Sets Test2

  4. 取消测试2
  5. 检查是否定义了Test1(不是)
  6. 检查是否定义了Test2(不是)
  7. 检查是否在这里定义(不是)
  8. 编译您的代码。

这意味着testFunc成为

void testFunc() {
    myval = -1;
}

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


0
投票

您打算这样做的方式,这是不可能的。宏是经过评估的[[before编译。它将简单地从上到下解析文档,并根据宏替换文本。当预处理到达testFunc时,TEST1TEST2都不再定义了(您在代码中的#undef都在前面),因此最终得到

void testFunc() { myval = -1; }
然后进行编译。看起来您想创建类似模板功能的东西?也许actual function templates可以解决您的问题。

0
投票
我在这里丢失了一些东西,当第一次调用testFunc()时,如何将HERE的值打印为1,然后在第二次调用时,将HERE的值打印为2。请帮助。

这是经过预处理后您尝试的函数的外观:

void testFunc() { myval = -1; }

您可以看到,该函数不接受任何形式的输入,并且始终无条件地将相同的值分配给全局变量。

您无法通过宏实现所需的功能。


要具有根据调用函数的次数打印不同值的行为,可以改用函数对象。函数对象可以具有内部状态:

auto testFunc = [HERE = 1]() mutable { return HERE++; }; std::cout << testFunc(); // prints 1 std::cout << testFunc(); // prints 2


0
投票
#的所有语句都称为预处理器指令。这些是给编译器的指令。您希望实际编译的代码保持有关程序运行时的状态。

您可以使用两种方法完成此操作:

    全局变量
  1. 静态变量
  • 以下示例显示了两种方法。每个函数还具有一个内存值,该值会更新以记住是否曾经调用过该函数。

    #include <iostream> bool g_ran_already = false; int first_different_global() { if (!g_ran_already) { g_ran_already = true; return 1; } else { return 2; } } int first_different_static() { static bool s_ran_already = false; if(!s_ran_already) { s_ran_already = true; return 1; } else { return 2; } } int main(int argc, char** argv) { std::cout << "first_different_global() run 1: " << first_different_global() << "\n"; std::cout << "first_different_global() run 2: " << first_different_global() << "\n"; std::cout << "first_different_global() run 3: " << first_different_global() << "\n"; std::cout << "first_different_static() run 1: " << first_different_static() << "\n"; std::cout << "first_different_static() run 2: " << first_different_static() << "\n"; std::cout << "first_different_static() run 3: " << first_different_static() << "\n"; }

    输出:

    first_different_global() run 1: 1 first_different_global() run 2: 2 first_different_global() run 3: 2 first_different_static() run 1: 1 first_different_static() run 2: 2 first_different_static() run 3: 2

  • © www.soinside.com 2019 - 2024. All rights reserved.