#include 任何地方

#include anywhere

本文关键字:任何地 #include      更新时间:2023-10-16

#include <file>是仅用于标头,还是只是可以在代码中的任何位置使用的机械"在此处注入此代码"?

如果我在 cpp 函数的中间使用它来"注入"来自单个来源的代码怎么办? 这会起作用还是编译器会为此尖叫?

它是一个机械注入代码的设备如果您愿意,可以包含一个包含歌德《浮士德》的文本文件。你可以把它放在任何地方,即使是在函数的中间(当然,#include需要一行新行!

但是,仅对头文件使用 #include 是强约定。可能有一些原因我不会反对它,例如拉入机器生成的代码或将所有翻译单元合并到一个文件中。

它不仅在任何地方都有效,而且可以带来一些有趣的技术。下面是一个示例,用于生成保证同步的枚举和相应的字符串表。

动物.h:

ANIMAL(Anteater)
ANIMAL(Baboon)
...
ANIMAL(Zebra)

动物图书馆.h:

#define ANIMAL(name) name,
enum Animals {
#include "Animals.h"
        AnimalCount
    };
#undef ANIMAL
extern char * AnimalTable[AnimalCount];

动物图书馆.cpp:

#include "AnimalLibrary.h"
#define ANIMAL(name) #name,
char * AnimalTable[AnimalCount] = {
#include "Animals.h"
    };

主.cpp:

#include "AnimalLibrary.h"
int main()
{
    cout << AnimalTable[Baboon];
    return 0;
}

确保不要将通常的包含保护放在任何将包含多次的文件中!

必须同意威廉·珀塞尔的观点,尽管这种技术会让人们挠头。

编译器不会抱怨,但每个必须维护代码的人都会抱怨。

它会工作 - 或多或少它的语义含义是: 将代码放在该文件中

编辑:对于滥用 #include 的用法,我可以推荐以下内容:

#include "/dev/console"

这允许一切:可以做任何事情的单行,一个错误,它只是一个编译问题......

应该

可以工作,它由你的预处理器处理,你的编译器甚至看不到它。

#include 和其他预处理器指令(如 #define 或 #import)可以出现在源代码中的任何位置,但仅适用于包含后的代码。它旨在将引用的代码包含在调用它的源文件中。这个MSDN页面很好地解释了它。http://msdn.microsoft.com/en-us/library/36k2cdd4(v=VS.71).aspx

include 由预处理器处理,是一种注入代码的机制。对于要包含的文件或此 #include 在代码中的位置没有限制(认为它应该在自己的行中)。只要预处理器可以找到指定的文件,它就会将其内容导入到当前文件中。

通常,对头文件执行此操作。我已经看到在模板实例化期间使用 cpp 文件完成此操作(使用适当的 #ifdef,因此您不会多次包含它,从而导致多符号定义错误)。

如果你有一个长常量,你也可以对其他文件类型执行此操作。(尽管有更好的方法来处理长字符串常量)

相关文章: