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。
您缺少的是预处理程序指令在编译之前执行。
这意味着当预处理程序解析您的代码时:
Sets Test1
取消测试1
Sets Test2
这意味着testFunc成为
void testFunc() {
myval = -1;
}
我会考虑使用预处理器以外的其他东西来完成您要实现的目标。
您打算这样做的方式,这是不可能的。宏是经过评估的[[before编译。它将简单地从上到下解析文档,并根据宏替换文本。当预处理到达testFunc
时,TEST1
和TEST2
都不再定义了(您在代码中的#undef
都在前面),因此最终得到
void testFunc()
{
myval = -1;
}
然后进行编译。看起来您想创建类似模板功能的东西?也许actual function templates可以解决您的问题。
我在这里丢失了一些东西,当第一次调用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
#
的所有语句都称为预处理器指令。这些是给编译器的指令。您希望实际编译的代码保持有关程序运行时的状态。您可以使用两种方法完成此操作:
#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