gpt4 book ai didi

c++ - 我可以在字符串化之前强制展开未定义的宏吗?

转载 作者:太空狗 更新时间:2023-10-29 20:26:31 27 4
gpt4 key购买 nike

免责声明:我已经看过类似 Stringification of a macro value 的问题的答案。 .

考虑以下测试程序:

#include <stdio.h>
#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)

#define MACRO HelloWorld

int main() {
printf("%s\n", EXPAND_AND_QUOTE(MACRO));
printf("%s\n", QUOTE(MACRO));

#undef MACRO
printf("%s\n", EXPAND_AND_QUOTE(MACRO));
printf("%s\n", QUOTE(MACRO));
}

这个程序的输出是:

HelloWorld
MACRO
MACRO
MACRO

期望的输出是

HelloWorld
MACRO

MACRO

有没有办法重新定义我的宏(即不是 MACRO 的元宏)以获得所需的输出?

特别是,我希望第三个 printf 应该等同于:

printf("%s\n", QUOTE());

也就是说,我希望将未定义的宏扩展为“无”,然后将“无”传递给引用函数。

最佳答案

这在标准 C 中是不可能的。

在宏替换期间, token 可能会发生四种情况。它可以保持不变,可以用替换值替换,可以与另一个标记连接,也可以字符串化。

如果MACRO没有改变,就没有办法区分这两种情况:

#undef MACRO
printf("%s\n", EXPAND_AND_QUOTE(MACRO));

#define FOO MACRO
printf("%s\n", EXPAND_AND_QUOTE(FOO));

一旦 FOO 在后者中被替换,我们有两种情况:在一种情况下,我们有 MACRO 因为它没有改变。另一方面,我们有 MACRO,因为它被替换为 FOO。在那之后,行为必须相同。但是问题要求要求不同的行为,"" 用于前者,"MACRO" 用于后者。由于相同的行为不会产生不同的结果,因此这行不通。 (但下面会详细介绍这一点。)

第二种可能性,用另一个值替换,不会发生,因为 MACRO 没有定义。

第三种可能性只是产生一些新的 token ,例如FOOMACRO。然而,虽然我们可以选择第一部分,但我们不能选择后一部分,所以我们不知道会产生什么标记,并且我们可以根据 MACRO 是否是不同的来做任何事情。定义与否。

第四种可能和第三种存在同样的问题,我们生成了“MACRO”,但无法使用。

我对此做某事的唯一模糊希望是生成两个 token ,一个是让 token 被替换的结果,一个不是。例如,我们可以产生这样一种情况,其中给定上述 MACRO 的非定义和 FOO 的定义,EXPAND_AND_QUOTE(MACRO) 产生,在辅助宏扩展链中的某处,两个标记 SomethingMACROSomethingMACRO,而 EXPAND_AND_QUOTE(FOO) 生成 SomethingFOOSomethingMACRO。这是可能的,但是我们如何处理这两个 token 呢?我们可以将两者都字符串化,然后在运行时将它们与 strcmp 进行比较。但是,我不认为在编译时可以做任何事情。另外,它无法区分FOO定义为#define FOO FOO的情况;如果我们成功地比较了上述标记,那将生成 "",但要求它生成 "FOO"

关于c++ - 我可以在字符串化之前强制展开未定义的宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19600820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com