定义#define宏

时间:2012-09-16 14:59:51

标签: c c-preprocessor

我想知道在C语言中是否有一种方法可以像这样定义#define

#define something #define
something a 42
something b 42

4 个答案:

答案 0 :(得分:5)

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

来自C standard

  

6.10.3.4重新扫描和进一步更换

     

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

答案 1 :(得分:2)

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

ISO / IEC 9899:2011

  

6.10.3.4重新扫描和进一步更换

     

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

引用的'pragma unary运算符'是#运算符,它接受字符串文字。

C99中的措辞非常相似,措辞是C89类似但未提及_Pragma()运算符,因为它在C89中不存在。


您可以在Open Standard网站上找到C2011标准的草稿:

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

(JTC1是联合技术委员会1; SC22是编程语言的标准化委员会22; WG14是第14工作组,负责C标准。WG21负责C ++标准。)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

如: -

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