【问题标题】:#include anywhere#包括任何地方
【发布时间】:2011-07-30 21:50:05
【问题描述】:

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

如果我在 cpp 函数的中间使用它来从单一来源“注入”代码会怎样?这会奏效还是编译器会为此大喊大叫?

【问题讨论】:

  • 你为什么不先看看自己呢?
  • ..现在不在编译器附近...

标签: c++ include c-preprocessor


【解决方案1】:

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

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

【讨论】:

  • 您可以免费下载歌德的浮士德here ;)
  • 你可以把它几乎放在任何地方。 #include 必须是预处理器标记,并且必须是一行中的第一个标记。所以,a #include <op> c 在单行上是行不通的。字符串文字中的#include 也不会。
【解决方案2】:

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

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,尽管这种技术会让人们摸不着头脑。

【讨论】:

  • 太酷了!花了我一些时间来弄清楚发生了什么,但是是的!
【解决方案3】:

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

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

#include "/dev/console"

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

【讨论】:

  • 这实际上不起作用。编译只是挂起并输入新行没有做任何事情。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 2020-07-20
          相关资源
          最近更新 更多