c++ - 为什么一个定义规则,而不是一个声明规则?

标签 c++ c one-definition-rule

我已阅读以下资料:

https://www.wikiwand.com/en/One_Definition_Rule

http://en.cppreference.com/w/cpp/language/definition

What is the difference between a definition and a declaration?

但是还是不明白为什么是One Definition Rule而不是One Declaration Rule?

我认为声明是定义的子集,因此一个定义规则就足够了。

最佳答案

一个声明规则会过于严格,会阻止多次使用同一 header 的程序进行编译。这也使得无法使用反向引用定义数据结构。

查看第一点(使用标题)的一个简单方法是考虑一个由两个翻译单元组成的程序,A.cppB.cpp , 其中都包括 <string>标题。

Header included twice

翻译单元 A.cppB.cpp都是独立翻译的。通过包括 <string> , 两个翻译单位都获得了 std::string 的声明.

关于第二点(具有反向引用的数据结构),请考虑定义一棵树的示例,其中每个节点都有对其父树的反向引用:

// Does not compile
struct tree {
    struct node *root;
};
struct node {
    struct node *left;
    struct node *right;
    struct tree *owner;
};

这个例子不会编译,因为node来自 struct node *tree未声明。切换 struct node 的顺序和 struct tree声明无济于事,因为那样tree来自 struct tree *owner将未声明。 C 和 C++ 中唯一的解决方案是为两个 struct 中的任何一个引入第二个声明。

关于c++ - 为什么一个定义规则,而不是一个声明规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46988095/

相关文章:

c# - Visual C++ 输出窗口中出现额外的单词

c++ - Oracle OCI 将无效的 UTF8 字符更改为 U+FFFD

c - 我遇到了一个非常奇怪的计时错误,有些东西在我认为应该执行之前就已经执行了

c - 绑定(bind)失败 : : Address family not supported by protocol family - C

c++ - 纯虚函数实现

c++ - 堆栈损坏,不知道是什么原因造成的

c++ - C++中while循环执行中的printout语句

c fscanf for ints 导致段错误

c++ - 是否允许获取未定义函数的地址?

c++ - 这可以在 C++ 中合法地完成吗?