2

我如何解释这个 C 代码:

typedef enum {
    #include <test.h>
    enum1,
    enum2,
    …
} test_enum;

test.h 包含许多宏。这个怎么理解?

是否意味着枚举的定义需要头文件中定义的宏?

可以#include出现在任何地方吗?

4

4 回答 4

6

#include语句可以出现在任何一行。它最常用于包含整个声明。但是,它可用于插入任何文本。

它可能test.h包含要在enum. 它还可能包含预处理器语句,例如宏定义或#if … #endif语句。

您必须显示的内容test.h才能进一步帮助理解它。

于 2013-05-09T01:29:29.650 回答
2

#include并且#define预处理器指令而不是实际代码。

你可以把它们放在任何地方(除了作为文字字符串的一部分)——一些编译器比其他编译器更挑剔(即 # 必须在第 0 列)。

预处理器根据需要扩展它们,这就是编译器所看到的。至于在您的情况下意味着什么,取决于 test.h 的内容

通常有一个编译器选项可以查看您的代码,并扩展了所有预处理器内容(我认为在 gcc 上曾经是 -e 或 -E )

于 2013-05-09T01:30:29.210 回答
2

#include 指令使包含文件的内容准确地放置在#include 指令的位置。生成的代码就是扩展发生后的样子,并且可以是任何有效的语言结构。

如果包含的文件包含:

enum_a,
enum_b,
enum_c,

然后包含后,您的代码将如下所示:

typedef enum {
    enum_a,
    enum_b,
    enum_c,
    enum1,
    enum2,
    …
} test_enum;

这是一个有效的构造。

#include 指令可以出现在任何地方。看到这个

于 2013-05-09T01:52:09.177 回答
0

预处理器语句可以出现在任何地方并且是简单的文本替换。处理后的代码是否是有效的 C 代码由编译器检查,而不是预处理器。

根据您的编译器,您可以查看预处理器所做的更改。

对于 gcc,这将是-E标志,因此通过编译源代码

gcc -E in.c 

test.h插入和处理后,您可以看到枚举声明中包含哪些更改代码。

于 2013-05-09T01:32:43.977 回答