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