如何解决MSVC ++ 2008 Express Editon编译器可以做什么,不能做什么
|| 考虑到以下示例,我一直想知道msvc ++ 2008编译器是否照顾同一个文件的多个标头包括: main.cpp#include \"header.h\"
#include \"header.h\"
编译器会多次还是仅一次包含此文件? (我知道我可以使用#ifndef \“技巧\”来防止这种情况的发生)
另外,如果我包含包含10个函数的\“ header.h \”,但我仅调用或使用2,它是否仍将包含全部10个或仅包含我需要的2个及其所有需求?
解决方法
不,编译器(或更准确地说是预处理器)不会“自动”处理此问题。在Visual C ++ 2008或任何其他版本中都没有。而且您真的不想要它。
有两种标准的解决方法。您应该选择其中之一。
第一个被称为包括警卫队。这就是您在问题中提到的“
#ifndef
把戏”。但这当然不是“把戏”。这是在编写C ++代码时处理这种情况的标准习惯用法,任何其他查看您的源文件的程序员都几乎可以肯定希望在其中的某个地方包含防护措施。
另一个利用VC ++功能(一个也可以在其他几个C ++工具箱中找到它的方式)以某种更容易键入的方式完成基本相同的操作。通过在头文件的顶部包括行“ 2”,您可以指示预处理器每个翻译单元仅包含一次头文件。与包括卫兵相比,这还有一些其他优点,但是它们在这里并不特别相关。
至于第二个问题,链接器将负责“优化”从未在代码中调用的函数。但这是编译的最后阶段,与#include
无关,正如我在上文中提到的那样,#include
是由预处理器处理的。
, “ 3”基本上是“复制粘贴”的同义词。如果执行相同的“ 3”操作,则该头文件的内容将被依次复制和粘贴两次。
至于您的第二个问题,这没有任何意义。 “ 3”由预处理器执行,该预处理器在编译器和链接器之前运行。预处理器不知道或不在乎头文件的内容,它只是将其复制并粘贴到其中。链接器可以消除不必要的功能,但这完全独立于预处理器。
, MSVC 20xx预处理器(不是编译器-编译器从不看到预处理器指令)在任何意义上都不会“照顾”同一文件的多个#include。如果文件被#include两次,则预处理器将遵循#includes并将文件包含两次。 (如果预处理器甚至考虑过尝试纠正源文件的“坏” #include行为,请想象一下混乱)。
由于预处理器非常细致且谨慎地遵循您的说明,因此每个#include文件必须保护自己免受#include两次的侵害。当我们在头文件的顶部找到这样的行时,就会看到这种保护:
#ifndef I_WAS_ALREADY_INCLUDED // if not defined,continue with include
#define I_WAS_ALREADY_INCLUDED // but make sure I\'m not included again
[ header-file real contents ]
#endif // I_WAS_ALREADY_INCLUDED
编写头文件时,必须始终确保以这种方式对其进行保护。
, 你为什么在乎?它不会给编译器增加太多负担,因为编译器有条件地(例如,以8表示)排除了不需要编译的代码。
, 预处理器将包含这些标头的2倍。这就是为什么需要头文件中的防护的原因。
据我所知,链接器大多数情况下会删除较新的代码(函数),以减少可执行文件的大小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。