分享

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

 印度阿三17 2019-08-25

免责声明:我已经看过类似于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中是不可能的.

在宏替换期间,令牌可能会发生四件事.它可以保持不变,可以用替换值替换,它可以与另一个令牌连接,并且可以进行字符串化.

如果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”.

来源:https://www./content-4-408751.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多