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

merlin2011

免责声明:我已经查看了类似于宏值的字符串化的问题的答案

考虑以下测试程序:

#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());

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

埃里克·波斯蒂奇(Eric Postpischil)

在标准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和定义的情况下FOOEXPAND_AND_QUOTE(MACRO)在辅助宏的扩展链中的某个位置产生两个标记SomethingMACROSomethingMACRO,而EXPAND_AND_QUOTE(FOO)产生SomethingFOOSomethingMACRO这是可能的,但是接下来我们要如何处理这两个令牌?我们可以将两者都进行字符串化,然后strcmp在运行时与它们进行比较但是,我认为在编译时无法完成任何操作。同样,将无法区分FOO定义为的情况#define FOO FOO如果我们成功地比较了上述令牌,那将产生"",但要求要求它产生"FOO"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在未定义之前扩展宏

来自分类Dev

在未定义之前保存扩展的宏结果

来自分类Dev

如果未定义,则强制 javascript 将变量视为字符串

来自分类Dev

我可以在protobuf中定义常量字符串吗?

来自分类Dev

宏扩展后未定义的函数

来自分类Dev

字符串化一级宏扩展C

来自分类Dev

字符串化一级宏扩展C

来自分类Dev

格式化带有未定义数量的参数的字符串

来自分类Dev

React Native:导入“本地化字符串”对象时未定义不是对象

来自分类Dev

当我在控制器的函数中传递未定义的字符串时

来自分类Dev

为什么我的新字符串值在React.js中未定义?

来自分类Dev

Javascript字符串比较在我的div容器中返回“未定义”

来自分类Dev

未定义的方法“ permit”,用于“立即提交!”:字符串。我要去哪里错了?

来自分类Dev

为什么我的函数会返回未定义以及反向字符串

来自分类Dev

我可以防止自动将字符串强制转换为XName吗?

来自分类Dev

Rust宏可以创建编译时字符串吗?

来自分类Dev

使用不同大小的字符串文字初始化具有给定大小的静态char数组会导致未定义行为吗?

来自分类Dev

我可以从null告诉未定义的动作参数吗?

来自分类Dev

字符串的未定义方法`original_filename'

来自分类Dev

未定义的方法“ permit”,用于“ titleofcoolstuff”:字符串

来自分类Dev

元素类型无效,预期字符串未定义

来自分类Dev

Javascript:未定义字符串的格式

来自分类Dev

Jasper字符串函数方法未定义错误

来自分类Dev

未定义的方法“ permit”,用于“ 1”:字符串

来自分类Dev

未定义的方法“ permit”,用于“ 51”:字符串

来自分类Dev

解析JSON字符串返回未定义

来自分类Dev

StringTemplate:未定义内容[匿名]属性字符串

来自分类Dev

未定义的方法“ each”代表“ 27”:字符串

来自分类Dev

简单的javascript函数返回未定义的字符串

Related 相关文章

  1. 1

    在未定义之前扩展宏

  2. 2

    在未定义之前保存扩展的宏结果

  3. 3

    如果未定义,则强制 javascript 将变量视为字符串

  4. 4

    我可以在protobuf中定义常量字符串吗?

  5. 5

    宏扩展后未定义的函数

  6. 6

    字符串化一级宏扩展C

  7. 7

    字符串化一级宏扩展C

  8. 8

    格式化带有未定义数量的参数的字符串

  9. 9

    React Native:导入“本地化字符串”对象时未定义不是对象

  10. 10

    当我在控制器的函数中传递未定义的字符串时

  11. 11

    为什么我的新字符串值在React.js中未定义?

  12. 12

    Javascript字符串比较在我的div容器中返回“未定义”

  13. 13

    未定义的方法“ permit”,用于“立即提交!”:字符串。我要去哪里错了?

  14. 14

    为什么我的函数会返回未定义以及反向字符串

  15. 15

    我可以防止自动将字符串强制转换为XName吗?

  16. 16

    Rust宏可以创建编译时字符串吗?

  17. 17

    使用不同大小的字符串文字初始化具有给定大小的静态char数组会导致未定义行为吗?

  18. 18

    我可以从null告诉未定义的动作参数吗?

  19. 19

    字符串的未定义方法`original_filename'

  20. 20

    未定义的方法“ permit”,用于“ titleofcoolstuff”:字符串

  21. 21

    元素类型无效,预期字符串未定义

  22. 22

    Javascript:未定义字符串的格式

  23. 23

    Jasper字符串函数方法未定义错误

  24. 24

    未定义的方法“ permit”,用于“ 1”:字符串

  25. 25

    未定义的方法“ permit”,用于“ 51”:字符串

  26. 26

    解析JSON字符串返回未定义

  27. 27

    StringTemplate:未定义内容[匿名]属性字符串

  28. 28

    未定义的方法“ each”代表“ 27”:字符串

  29. 29

    简单的javascript函数返回未定义的字符串

热门标签

归档