如果目标文件已经有标题保护,我们是否应该使用#ifndef保护#include?

时间:2017-02-02 21:57:15

标签: c++ macros c-preprocessor include-guards

我们说我们有两个班,Foo和Bar。

在Foo.h中

#ifndef MYPROJ_FOO
#define MYPROJ_FOO
....
# endif 
在Bar.cpp中,我们还需要保护包括

在内的
#ifndef MYPROJ_FOO
#include <Foo.h>
#endif

或简单#include就足够了?如果我们已经有头球防守队员,那么对我来说似乎是多余的,但是我经常看到这样的练习,因此想知道我是否错过了什么。谢谢!

4 个答案:

答案 0 :(得分:5)

从功能上讲,它没有任何区别。

旧代码可能使用此代码的原因是优化。这意味着预处理器可以避免第二次读取Foo.h,因此它可以更快地生成结果。

如今,即使预处理器第二次读取文件,其性能影响应该足够小,不会打扰它。有些预处理器甚至可以自动检测标题保护,记住哪个标题保护与哪个宏相关联,并避免重新读取标题文件。

答案 1 :(得分:4)

不,你不应该。包括用于标题的保护,其他文件包含标题。另一方面,源文件永远不应包含在其他文件中。

或者,您可以考虑在头文件中使用(非标准但通常接受的)扩展名

$web = Get-SPWeb http://subsiteURL
$publishingWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
$pageTitlesToShow = @("Page Title") # this needs to be page title
$pages = $web.Lists["pages"]
foreach ($item in $pages.Items)
{
    if ($pageTitlesToShow.Contains($item.Title)){
        $item.Title
        $item.UniqueId
        $publishingWeb.Navigation.IncludeInNavigation($false,$item.UniqueId);        
    }
}

$publishingWeb.Update()
$web.Close()
$web.Dispose() 

答案 2 :(得分:3)

  在Bar.cpp中,我们还需要保护包括

在内的
#ifndef MYPROJ_FOO
#include <Foo.h>
#endif
     

或简单#include就足够了吗?

从正确的角度来看,

简单#include就足够了。

  

如果我们已经拥有头球防守队员,那么对我来说似乎是多余的,但我经常看到这样的练习,因此想知道我是否遗漏了什么。

John Lakos在他的书Large Scale C++ Software Design中推荐了这种做法。

但是,更好的选择是使用大多数现代C ++编译器支持的#pragma once指令。

foo.h中:

#pragma once
....

然后,你可以使用

#include "Foo.h"

在任何.cpp文件中。

答案 3 :(得分:2)

  

或简单#include就足够了?

是的,是的。

  

如果我们已经有头球后卫,那么对我来说似乎是多余的,

是的,这完全是多余的。

  

但我经常看到这种做法

除非代码作者不知道他们在做什么,否则我看不到这种做法。