1

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

#define something #define
something a 42
something b 42
4

4 回答 4

5

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

C 标准

6.10.3.4 重新扫描和进一步更换

3 所得到的完全被宏替换的预处理标记序列即使与预处理指令相似,也不会作为预处理指令处理,但其中的所有 pragma 一元运算符表达式随后将按照下面 6.10.9 中的规定进行处理。

于 2012-09-16T15:03:31.103 回答
2

不,没有。如果宏的扩展生成了一些看起来像预处理器指令的东西,它不会被当作一个处理,#在源代码中留下 a 被编译器正确看到,然后它将反对这#是一个意外的标记(语法错误) .

ISO/IEC 9899:2011

6.10.3.4 重新扫描和进一步更换

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

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

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


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

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

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

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

于 2012-09-16T15:03:44.037 回答
1

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

于 2012-09-16T15:04:51.787 回答
0

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

喜欢:-

#define something
#ifdef something
#define a 42
#else
#define b 42
#endif
于 2012-09-16T15:07:46.293 回答