预处理程序指令不在for循环中工作

时间:2015-07-17 10:46:13

标签: c++ c-preprocessor

我想知道预处理程序指令在 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;
}

1 个答案:

答案 0 :(得分:1)

预处理器是预编译阶段。它本质上是一个代码生成器,因此不了解您的for循环或与之互动。

你不能以这种方式迭代一个班级的成员。

这里是您的预处理代码的样子(由于显而易见的原因,我省略了标题扩展):

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的成员(某个对象名称太糟糕了;请更改它),希望您现在可以看到这是怎么回事&#34; work&#34;如你所愿。

此外,your macro is actually inherently broken and produces an error,因为您使用的是##,而您不应该这样做。即使这个代码是你想要的,正确的定义也只是:

#define PRINT1(std, X) printf("%d", std.X);