【问题标题】:C-Pre-Processor macros orderC-预处理器宏命令
【发布时间】:2016-12-14 11:44:09
【问题描述】:

我刚刚学习了一个教程,该教程涉及使用 CPP 宏在程序中实现调试系统。宏的一个很好的行为是递归,可以将宏放入另一个宏中,如下所示:

#define MACRO1 "World"
#define MACRO2 printf("Hello %s\n",MACRO1);
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
    MACRO2
    return 0;
}

输出:Hello World

以下似乎也有效:

#define MACRO2 printf("Hello %s\n",MACRO1);
#define MACRO1 "World"
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
    MACRO2
    return 0;
}

所以只是为了理解,CPP 是否首先读取所有#define X 以列出已声明的宏,然后替换其他宏中的宏,避免预处理中的“鸡与蛋”问题?

我认为这是有道理的,考虑到预处理是一个一次性的过程(在编译期间),而不是实时发生。因此,在代码中定义宏的位置无关紧要,但实际上是否定义了它。

如果有一个 3000 行的代码,并且只有在最后一行定义代码中使用的宏才有效?

提前谢谢你!

【问题讨论】:

标签: c macros c-preprocessor


【解决方案1】:

实际发生的是递归替换仅在使用宏时发生,而不是在定义宏时发生。

所以在

#define MACRO2 printf("Hello %s\n",MACRO1);

预处理器只记住 MACRO2 扩展为 7 个标记 printf("Hello %s\n",MACRO1);。在这一点上,它并不关心这些标记中的哪一个是宏。

main 你做的地方

MACRO2

预处理器将宏扩展为这七个标记,然后检查标记流是否包含更多可以再次扩展的宏。它注意到MACRO1 并替换令牌"World"。此时它再次检查,但没有更多宏可供扩展。

如果您尝试使用在#defined 之前使用的宏,您仍然会遇到问题。

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 2020-02-09
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多