我想知道在C语言中是否有一种方法可以像这样定义#define
:
#define something #define
something a 42
something b 42
答案 0 :(得分:5)
不,它在C中是不可能的。不允许在另一个宏中定义宏。
来自C standard:
6.10.3.4重新扫描和进一步更换
3由此产生的完全宏替换的预处理标记序列 即使它类似,也不会被处理为预处理指令 一个,但其中的所有pragma一元运算符表达式都是 按照下面6.10.9的规定处理。
答案 1 :(得分:2)
不,没有。如果宏的扩展生成看起来像预处理器指令的东西,则它不会被处理为一个,在编译器正确看到的源代码中留下#
,然后它将对象{{1是一个意外的令牌(语法错误)。
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