c - 强制捕获 C 预处理器宏值

标签 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 的值,即“早期”。但是上面的代码打印:

MACRO_B = late, MACRO_C = late

有没有办法强制 MACRO_B 在定义时捕获 MACRO_A 的值? (注意:在出现歧义的情况下,假设我们使用的是 gcc。)

我的真实用例是我使用单个宏形式创建共享定义的不同扩展:一个扩展定义struct布局,一个重新定义创建结构的初始值设定项等。这让我可以将所有信息保存在一个地方。

出于这个原因,在另一个宏中捕获“当前”宏扩展会很有用,这样我就可以在不丢失其状态的情况下重新使用原始定义。

最佳答案

这种做法违背了使用宏的目的。宏不应用于全局变量。

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

像这样:

#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;
}

关于c - 强制捕获 C 预处理器宏值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43334293/

相关文章:

c - 在 C 中设置 select() 和 write_fds

c - 如何从 C 应用程序使用 ArangoDB 图形 API

c++ - 模板特化,Windows 与 gcc 上的不同行为?

c - 在 c 中的函数开始和结束处添加唯一代码

header 中定义的常量值会通过数学运算产生意外行为

c - C 中使用 SIGALRM 的定时器线程

c - XOR 加密适用于不在 Visual Studio 2017 上的代码块

C++ STL 优化警告 : problem with the code or something more sinister?

c++ - 如何为 MinGW 用户安装 gcc-arm-none-eabi?

c - 我们如何在#define 语句中使用 union 和结构