强制捕获C预处理器宏值

时间:2017-04-10 23:13:39

标签: c gcc c-preprocessor

请考虑以下代码:

#include <stdio.h>

#define MACRO_A "early"
#define MACRO_B MACRO_A
#undef MACRO_A
#define MACRO_A "late"
#define MACRO_C MACRO_A

int main(void) {
        printf("MACRO_B = %s, MACRO_C = %s\n", MACRO_B, MACRO_C);
        return 0;
}

我预计MACRO_B会在定义时捕获MACRO_A的值,即&#34;早期&#34;。但上面的代码打印出来:

MACRO_B = late, MACRO_C = late

有没有办法强制MACRO_B在定义时捕获MACRO_A的值? (注意:如果含糊不清,假设我们正在使用gcc。)

我的真正的用例是我使用单个宏表单来创建共享定义的不同扩展:一个扩展定义struct布局,重新定义创建结构的初始化程序等。这使我可以将所有信息保存在一个地方。

出于这个原因,捕获&#34;当前&#34;另一个宏中的宏扩展,以便我可以重用原始定义而不会失去其状态。

2 个答案:

答案 0 :(得分:0)

这种方式违背了使用宏的目的。宏不应该用于全局变量。

一种替代方法是使用全局变量。而不是创建宏,使用静态全局变量并将它们设置为宏的值。

像这样:

#include <stdio.h>

#define MACRO_A "early"
static char* a = MACRO_A;
#define MACRO_B MACRO_A
static char* b = MACRO_B;
#undef MACRO_A
#define MACRO_A "late"
#define MACRO_C MACRO_A
static char* c = MACRO_C;

int main(void) {
        printf("MACRO_B = %s, MACRO_C = %s\n", a, c);
        return 0;
}

答案 1 :(得分:0)

由于C预处理器仅用其他文本替换文本,因此在处理printf行时会发生以下情况:

  • MACRO_B将替换为之前定义的文字MACRO_A;
  • 以递归方式,MACRO_A将被其当前定义所取代:"late"

以同样的方式:

  • MACRO_C将替换为之前定义的MACRO_A;
  • 然后以递归方式,MACRO_A将替换为"late"