繁体   English   中英

C ++中的声明和定义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM