如何解释此C代码:
typedef enum {
#include <test.h>
enum1,
enum2,
…
} test_enum;
test.h包含许多宏。怎么理解这个?
是否意味着枚举的定义需要在头文件中定义的宏?
可以#include
出现在哪儿吗?
答案 0 :(得分:6)
任何一行都可能出现#include
语句。它通常用于包括整个声明。但是,它可以用于插入任何文本。
test.h
可能包含要在enum
内声明的名称列表。它还可能包含预处理程序语句,例如宏定义或#if … #endif
语句。
您需要显示test.h
的内容,以便进一步了解它。
答案 1 :(得分:2)
#include
和#define
预处理器指令不是实际代码。
你可以将它们放在任何地方(除了作为文字字符串的一部分) - 有些编译器比其他编译器更繁琐(即#必须在第0列)。
预处理器根据需要扩展它们,这就是编译器所看到的。至于你的意思,取决于test.h的内容。
通常有一个编译器选项可以看到你的代码扩展了所有预处理程序的东西(我认为gcc用于-e或-E)
答案 2 :(得分:2)
#include指令使包含文件的内容完全放在#include指令的位置。生成的代码就是扩展发生后的代码,可以是任何有效的语言构造。
如果包含的文件包含:
enum_a,
enum_b,
enum_c,
然后在包含之后,您的代码将如下所示:
typedef enum {
enum_a,
enum_b,
enum_c,
enum1,
enum2,
…
} test_enum;
哪个是有效的构造。
#include指令可以出现在任何地方。 See this
答案 3 :(得分:0)
预处理器语句可以在任何地方发生,并且是简单的文本替换。处理后的代码是否有效C代码由编译器检查,而不是预处理器。
根据您的编译器,您可以查看预处理器所做的更改。
对于gcc,这将是-E
标志,因此通过使用
gcc -E in.c
在插入test.h
和之后,您可以看到枚举声明中包含哪些更改代码
处理它。