#include任何地方

时间:2011-04-06 14:44:44

标签: c++ include c-preprocessor

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

如果我在cpp函数中使用它来从单个源“注入”代码怎么办?这会有用吗还是编制者会为此尖叫?

7 个答案:

答案 0 :(得分:19)

机械在这里注入代码设备。如果您愿意,可以包含一个包含Goethe's Faust的文本文件。你可以把它放在任何地方,即使是在一个函数的中间(当然,#include需要一个新线!)。

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

答案 1 :(得分:10)

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

Animals.h:

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

AnimalLibrary.h:

#define ANIMAL(name) name,

enum Animals {
#include "Animals.h"
        AnimalCount
    };

#undef ANIMAL

extern char * AnimalTable[AnimalCount];

AnimalLibrary.cpp:

#include "AnimalLibrary.h"

#define ANIMAL(name) #name,

char * AnimalTable[AnimalCount] = {
#include "Animals.h"
    };

main.cpp中:

#include "AnimalLibrary.h"

int main()
{
    cout << AnimalTable[Baboon];
    return 0;
}

请确保不要将常用的包含警卫放在任何多次包含的文件中!

同意William Pursell虽然这种技术会让人摸不着头脑。

答案 2 :(得分:7)

它会起作用 - 或多或少它的语义是:在这里放置代码

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

#include "/dev/console"

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

答案 3 :(得分:5)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

传统上,您对头文件执行此操作。我已经看到在模板实例化期间使用cpp文件(使用正确的#ifdef,因此您不会多次包含它导致多个符号定义错误)。

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