【问题标题】:defining #define macro定义#define宏
【发布时间】:2012-09-16 14:59:50
【问题描述】:

我想知道 C 语言中是否有办法像这样定义#define:

#define something #define
something a 42
something b 42

【问题讨论】:

  • 您是否费心尝试自己先编译这个?
  • 可以合理地推断,是的,这段代码已经尝试过了,但它不起作用,但问题是是否有其他方法可以达到与预期相似的结果。跨度>

标签: c c-preprocessor


【解决方案1】:

不,这在 C 中是不可能的。不允许在另一个宏中定义宏。

来自C standard:

6.10.3.4 重新扫描和进一步替换

3 得到的完全宏替换的预处理标记序列 不会作为预处理指令处理,即使它类似于 一个,但其中的所有 pragma 一元运算符表达式都是 按照下面 6.10.9 的规定进行处理。

【讨论】:

  • 请注意,给出的 URL 实际上甚至不是 C11 标准的最新草案。您可能应该参考ANSI 提供的 PDF,价格为 30 美元。
  • 引用部分对于这个答案来说是可以的,但 30 美元对我来说很多:D
  • 可以将其视为未来十年的投资——每天的收益不到一美分。如果你不是一个全职的 C 程序员,那么它就不那么重要了,但大多数计算教科书的成本都很高。
  • @JonathanLeffler 知道为什么 ANSI 网站上的 C11 标准是 30 美元,而 ISO 网站上的版本超过 200 美元吗? iso.org/iso/iso_catalogue/catalogue_tc/…
  • 不同的组织收取不同的金额。 ANSI 在数量上弥补了它在单价上的不足?对于 C99 标准,还有一本同时包含标准和基本原理的书,价格约为 60 美元。它比 ANSI 的 PDF 贵,但比 ISO 本身的标准(纸质或 PDF、IIRC)便宜。
【解决方案2】:

不,没有。如果宏的扩展生成看起来像预处理器指令的东西,它不会作为一个处理,在源代码中留下一个#,编译器可以看到,然后它会反对#是一个意外令牌(语法错误)。

ISO/IEC 9899:2011

6.10.3.4 重新扫描并进一步替换

¶3 不处理生成的完全宏替换的预处理标记序列 作为预处理指令,即使它类似于一个,但所有 pragma 一元运算符 然后按照下面 6.10.9 的规定处理其中的表达式。

所指的“pragma unary operator”是 _Pragma() 运算符,它采用字符串文字。

C99 中的写法非常相似,写法是 C89 相似但没有提及 _Pragma 运算符,因为它在 C89 中不存在。


您可以在开放标准网站上找到 C2011 标准的草案:

连同工作文件、委员会会议的“邮件”等。

(JTC1 是 Joint Technical Committee 1;SC22 是 Standardization Committee 22,负责编程语言;WG14 是 Working Group 14,负责 C 标准。WG21 负责 C++ 标准。)

您可以以 30 美元的价格从ANSI 获取您自己的标准 PDF 的个性化副本。我认为这是任何认真的 C 程序员的必要投资。

【讨论】:

  • 你能提供一个参考吗?
【解决方案3】:

没有。预处理器只执行一次,所以最后,进入编译器的代码包含一个#define,这是一个语法错误。

【讨论】:

    【解决方案4】:

    如果你想根据other的定义来定义一些东西,C提供#ifdef来实现它

    喜欢:-

    #define something
    #ifdef something
    #define a 42
    #else
    #define b 42
    #endif
    

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      相关资源
      最近更新 更多