c++ - 预处理器指令在 for 循环中不起作用

标签 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;
}

最佳答案

预处理器是预编译阶段。它本质上是一个代码生成器,因此不了解您的 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/

相关文章:

c++ - 单例模式和 std::unique_ptr

c - 什么是更好的? #define getmax(a, b) 或 int getmax(a, b)

linux - Linux makefile 中的预处理器指令

c++ - 带有友元运算符的模板类的嵌套类,编译错误

c++ - 是什么让 char * 成为一个字符数组?

c++ - 动态分配二维智能指针数组的语法

从定义中创建字符串文字

c++ - 这个声明是什么意思?

c - 编写一个变量宏,它在一个整数中设置特定位(位掩码)

c++ - 使用 boost 波