[英]Declaration and definition in c++
我认为每个声明都是定义,因为标准引用了以下内容:
声明是一个定义,除非%restrictions% 。
但是我的假设是不正确的。 实际上,应用ODR可以得到以下程序
class A;
class A;
int main(){ }
格式不正确。 但这不是真的。 我找不到允许在声明性区域中重新声明类类型的标准的一部分。
是的,“除非%restrictions%,否则声明是定义”是正确的。 您阅读限制吗? 其中之一是:
这是一个类名声明
所以class A;
不是定义,因为它已被其中一项限制所覆盖。
为了澄清,引用C ++ 11, [basic.def]§2
第 3.1.2段规定:
声明是一个定义,除非它在未指定函数主体(8.4)的情况下声明了函数,它包含extern说明符(7.1.1)或链接规范25(7.5),并且声明了初始化器和函数体类定义(9.2,9.4)中的静态数据成员, 它是类名称声明 (9.1),它是不透明枚举声明(7.2),它是模板参数(14.1),它是一个参数不是函数定义声明符的函数声明符中的-declaration(8.3.5),或者它是typedef声明(7.1.3),别名声明(7.1.3),using声明(7.3) .3),static_assert-声明(Clause 7),属性声明(Clause 7),空声明(Clause 7)或use-directive(7.3.4)。
这里
class A;
class A;
int main(){ }
这是一个类名声明。
在声明中
声明是一个定义,除非%restrictions%。
%restrictions%。 部分很重要。
我以为每个声明都是定义
让我们通过矛盾证明这是不正确的。 因此,假设这是真的。 然后,因为我们可以有很多重新声明,并且每个声明都是定义-我们可以有很多重新定义,对吗? 但是C ++标准n3337§3.2 / 1说
任何变量,函数,类类型,枚举类型或模板的翻译单元均不得包含一个以上的定义。
与我们的假设相矛盾的,因此并非每个声明都是定义都是不正确的。
您的引号(来自C ++ 11 3.1 / 2)回答了以下一般性问题:“除非%restrictions% ”表示并非每个声明都是定义。 如果这些限制都不适用,这只是一个定义。
阅读这些限制,您会发现
这是一个类名声明
可以回答您的特定问题。 class A;
是一个类名声明,但不是定义。
我找不到允许在声明性区域中重新声明类类型的标准的一部分。
通常,根据C ++ 11 3.3.1 / 4,您可以在同一声明区域中多次声明一个实体。
给定在单个声明性区域中的一组声明,每个声明都指定相同的无限定名称,它们都应引用同一实体,或[此处不相关的其他情况]
考虑以下情况:
那么header1.h:
class A;
void function1(A * a);
Header2.h:
class A;
void function2(A * a);
main.cpp中
#include "Header1.h"
#include "Header2.h"
#include "A.h" // header file defining A
int main()
{
}
这对编译器真正是什么样的:
class A;
void function1(A * a);
class A;
void function2(A * a);
class A { /* definition from A.h */ };
int main()
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.