【问题标题】:Should the include guards be unique even between namespaces?即使在命名空间之间,包含守卫也应该是唯一的吗?
【发布时间】:2011-07-08 15:08:17
【问题描述】:

我在两个命名空间中使用相同的类名,比如 A 和 B。在声明具有不同命名空间的类时,包含保护是否应该是唯一的?

我的意思是不能有两个文件名 AFile.h(在不同的目录中)具有相同的包含保护并声明不同的命名空间吗?

 //File 1:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace A { 

   class CAFile {...

   }; 

 };

 #endif

//File 2:

 #ifndef AFILE_H 

 #define AFILE_H

 namespace B { 

   class CAFile {...

   }; 

 };

 #endif

【问题讨论】:

    标签: c++ namespaces include include-guards


    【解决方案1】:

    如果某些代码(直接或间接)需要同时查看 A::CAFile 和 B::CAfile,则您的守卫需要有所不同。

    包含守卫由预处理器处理,它不了解所有类(更不用说命名空间了)。如果在处理 c++ 文件时包含这两个文件,并且它们具有相同的标头保护,则只有一个声明将保留在编译器将看到的预处理源中。

    看看像 Boost 文件这样的东西,它们有一些关于标头保护的约定(如果我没记错的话)。

    【讨论】:

    • 一般来说,由于很难预测文件的使用(通过维护),最好让标头保护在整个应用程序中保持唯一,包括依赖项。我不记得 BOOST 是否有正式的指导方针,但它们的风格相当沉重 :) 其他技术涉及使用 GUID 或 #pragma once 指令
    【解决方案2】:

    包含守卫只影响预处理器,而预处理器不了解 C++ 并完全忽略命名空间。所以守卫应该是文件唯一的,而不是命名空间的。

    【讨论】:

    • 他的观点是,仅仅为 file.h 设置一个名为 _FILE_H 的保护是不够的,因为其他一些包含可以使用相同的保护。虽然预处理器不关心命名空间,但确保 std 命名空间中 vector.h 的保护与其他命名空间中的 vector.h 保护不同是有意义的。
    • @Andrew White:好的,你是对的,但这又归结为“文件系统上的每个文件都是唯一的”,与命名空间无关。是的,他可能应该根据文件所在的位置为守卫添加前缀。
    • 事实上,包含守卫在命名空间之间应该是唯一的因为预处理器会忽略 C++ 命名空间。
    • 我很惊讶一个匿名的白痴孩子利用他的时间来否决这个答案。路过的投票者会随机选择答案吗?这是我能看到的唯一解释。
    • @Alf P. Steinbach:也许你的推理是对的,但 IMO 对此类案件的态度要好得多:knowyourmeme.com/memes/keep-calm-and-carry-on
    【解决方案3】:

    简而言之,这可能是个好主意。以下是 GCC 的工作方式...

    #ifndef _GLIBCXX_VECTOR
    #define _GLIBCXX_VECTOR 1
    

    我不知道每个人都使用命名空间,但包含保护应该是您打包的接口所独有的(可能都在一个命名空间内或分布在多个命名空间中)。

    【讨论】:

      【解决方案4】:

      就我个人而言,我一直在使用#pragma once,因为我关心的编译器都支持它,并且您可以避免您在此处提到的那种问题。如果你想使用#include 守卫,那么你可能需要聪明一点。否则#includeing Foo/header.h 可能无法正常工作,因为您已经#included Bar/header.h

      我不同意其他情况下的样式指南,但Google recommends <PROJECT>_<PATH>_<FILE>_H_。虽然这确实意味着如果您将文件复制到不同的路径,您将不得不更新 #include 保护。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-03
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 2018-08-11
        相关资源
        最近更新 更多