代码之家  ›  专栏  ›  技术社区  ›  ravi chandra

为什么这不违反一条定义规则?

  •  -1
  • ravi chandra  · 技术社区  · 8 年前

    我是c++新手,试图理解“一个定义”规则。将包括以下测试。多个c++文件中的h文件遵循一个定义规则(syspath和标记)。如果没有,为什么没有?

     #ifndef TEST_H
     #define TEST_H_
    
    #include <string>
    #include <unordered_set>
    
    namespace X {
    
    class Test {
      public:
         // Default constructor.
         Test();
         ~Test();
    
         const std::string& syspath() const { return syspath_; }
         const std::unordered_set<std::string> tags() const { return tags_;}
       private:
         std::string syspath_;
         std::unordered_set<std::string> tags_;
    };
    
    }  // namespace X
    
    #endif  // TEST_H_
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Chris Dodd    8 年前

    syspath tags 不是对象或非内联函数,因此ODR不适用于它们。类型的ODR间接应用于它们(因为它们是类型的一部分 X::Test ),但只要他们(和 十: :测试 )在每个编译单元中都是相同的,它们很好。

    作为 wikipedia page 注意,ODR有两个相关但不同的部分——一个应用于编译单元内的模板、类型、函数和对象,另一个应用于跨编译单元的对象和非内联函数。

        2
  •  1
  •   eerorika    8 年前

    ODR允许一个类的多个定义以及内联函数的定义,只要所有定义都相同,并且每个定义都在一个单独的转换单元中。后一个要求是由头部防护装置满足的(或者如果没有输入错误的话)。

    类定义仅声明数据成员。这些不是变量定义。ODR允许无限声明。

    在构造类的实例之前,不存在成员变量的实例,并且类的每个实例都包含一个单独的变量实例。

    如果此标头包含在多个翻译单元中,则不会违反ODR。