请考虑以下代码:
#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;另一个宏中的宏扩展,以便我可以重用原始定义而不会失去其状态。
答案 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"
。