我想知道当预处理器指令被放置在 C/C++ 的循环中时,它们是如何求值的? 以下是在 for 循环中使用指令的代码,但它不起作用。为什么会这样?
main.cpp
#include <stdio.h>
class Student
{
public:
int roll;
int marks;
Student()
{
roll = 10;
marks = 0;
}
};
int main()
{
printf("Hello, World!\n");
int iCounter;
char attr[][6] = {"roll", "marks"};
Student std;
#define PRINT1(std, X) printf("%d", std.##X);
for (iCounter = 0; iCounter < 2; iCounter++)
{
PRINT1(std, attr[iCounter])
}
return 0;
}
最佳答案
预处理器是预编译阶段。它本质上是一个代码生成器,因此不了解您的 for
循环,也不会与之交互。
您根本无法以这种方式遍历类的成员。
这是您的预处理代码的样子(出于显而易见的原因,我省略了 header 扩展):
class Student
{
public:
int roll;
int marks;
Student()
{
roll = 10;
marks = 0;
}
};
int main()
{
printf("Hello, World!\n");
int iCounter;
char attr[][6] = {"roll", "marks"};
Student std;
for (iCounter = 0; iCounter < 2; iCounter++)
{
printf("%d", std.attr[iCounter]);
}
return 0;
}
由于 attr
不是 std
的成员(一个对象的糟糕名称;请更改它),希望您现在可以了解这将如何“不起作用” "如您所愿。
此外,your macro is actually inherently broken and produces an error ,因为您在不应该使用的地方使用 ##
。即使这段代码是您想要的,正确的定义也应该很简单:
#define PRINT1(std, X) printf("%d", std.X);
关于c++ - 预处理器指令在 for 循环中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474049/