免责声明:我已经查看了类似于宏值的字符串化的问题的答案。
考虑以下测试程序:
#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中这是不可能的。
宏替换期间,令牌可能发生四件事。它可以保持不变,可以用替换值替换,可以与另一个标记连接,并且可以进行字符串化。
如果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
未定义,因此不会发生第二种可能性,即用另一个值替换。
第三种可能性只是产生一些新令牌,例如FOOMACRO
。但是,尽管我们可以选择第一部分,但是我们不能选择第二部分,因此我们无法知道将产生什么令牌,并且我们无法对其进行任何处理,这取决于是否MACRO
定义。
第四种可能性与第三种可能性存在相同的问题,我们产生"MACRO"
并且不能利用它。
我对此所做的唯一含糊的希望是产生两个令牌,一个是替换令牌的结果,一个不是令牌的结果。例如,我们可以产生一种情况,在给定上述非定义MACRO
和定义的情况下FOO
,EXPAND_AND_QUOTE(MACRO)
在辅助宏的扩展链中的某个位置产生两个标记SomethingMACRO
和SomethingMACRO
,而EXPAND_AND_QUOTE(FOO)
产生SomethingFOO
和SomethingMACRO
。这是可能的,但是接下来我们要如何处理这两个令牌?我们可以将两者都进行字符串化,然后strcmp
在运行时与它们进行比较。但是,我认为在编译时无法完成任何操作。同样,将无法区分FOO
定义为的情况#define FOO FOO
;如果我们成功地比较了上述令牌,那将产生""
,但要求要求它产生"FOO"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句