C++ c+中的声明和定义+;
我认为每个声明都是定义,因为标准中有以下引用: 声明是一种定义,除非%restrictions% 但我的假设是不正确的。实际上,应用ODR,我们有以下程序C++ c+中的声明和定义+;,c++,language-lawyer,C++,Language Lawyer,我认为每个声明都是定义,因为标准中有以下引用: 声明是一种定义,除非%restrictions% 但我的假设是不正确的。实际上,应用ODR,我们有以下程序 class A; class A; int main(){ } 他身体不好。但事实并非如此。我找不到允许在声明区域重新声明类类型的部分标准。是,“声明是一个定义,除非%restrictions%”为真。你读过限制吗?其中之一是: 它是一个类名声明 SoA类不是一个定义,因为它包含在一个限制中 只是想澄清一下,引用C++11,[basic.
class A;
class A;
int main(){ }
他身体不好。但事实并非如此。我找不到允许在声明区域重新声明类类型的部分标准。是,“声明是一个定义,除非%restrictions%”为真。你读过限制吗?其中之一是:
它是一个类名声明
SoA类代码>不是一个定义,因为它包含在一个限制中
只是想澄清一下,引用C++11,[basic.def]§2
是,“声明是一个定义,除非%restrictions%”是真的。你读过限制吗?其中之一是:
它是一个类名声明
SoA类代码>不是一个定义,因为它包含在一个限制中
为了澄清,引用C++11,[basic.def]§2
第3.1.2段指出
声明是一个定义,除非它声明了一个没有
指定函数的主体(8.4),它包含外部说明符
(7.1.1)或联动装置规范25(7.5),且均不是初始值设定项
也不是函数体,它在类中声明静态数据成员
定义(9.2,9.4),它是一个类名声明(9.1),它是一个
不透明枚举声明(7.2),它是一个模板参数(14.1),它
是函数声明程序中的参数声明(8.3.5),该函数声明程序
不是函数定义的声明符,或者它是typedef
声明(7.1.3)、别名声明(7.1.3)、使用声明
(7.3.3)、静态声明(第7条)、属性-
声明(第7条)、空声明(第7条)或
使用指令(7.3.4)
这里
它是一个类名声明
在一份声明中
声明是一个定义,除非%restrictions%
百分比限制为%。这一部分很重要
我认为每个声明都是定义
让我们用一个例子来证明这不是真的。假设这是真的。然后,因为我们可以有许多重新声明,并且每个声明都是定义-我们可以有许多重新定义,对吗?但是C++标准N33 37 <强></强> 3.2/1表示
任何翻译单位不得包含一个以上的定义
变量、函数、类类型、枚举类型或模板
与我们的假设相矛盾的是,并非每个声明都是定义。第3.1.2段指出
声明是一个定义,除非它声明了一个没有
指定函数的主体(8.4),它包含外部说明符
(7.1.1)或联动装置规范25(7.5),且均不是初始值设定项
也不是函数体,它在类中声明静态数据成员
定义(9.2,9.4),它是一个类名声明(9.1),它是一个
不透明枚举声明(7.2),它是一个模板参数(14.1),它
是函数声明程序中的参数声明(8.3.5),该函数声明程序
不是函数定义的声明符,或者它是typedef
声明(7.1.3)、别名声明(7.1.3)、使用声明
(7.3.3)、静态声明(第7条)、属性-
声明(第7条)、空声明(第7条)或
使用指令(7.3.4)
这里
它是一个类名声明
在一份声明中
声明是一个定义,除非%restrictions%
百分比限制为%。这一部分很重要
我认为每个声明都是定义
让我们用一个例子来证明这不是真的。假设这是真的。然后,因为我们可以有许多重新声明,并且每个声明都是定义-我们可以有许多重新定义,对吗?但是C++标准N33 37 <强></强> 3.2/1表示
任何翻译单位不得包含一个以上的定义
变量、函数、类类型、枚举类型或模板
什么与我们的假设相矛盾,因此并非每个声明都是定义。考虑以下情况:
标题1.h:
class A;
void function1(A * a);
标题2.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()
{
}
考虑以下情况:
标题1.h:
class A;
void function1(A * a);
标题2.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()
{
}
您的引用(来自C++11 3.1/2)回答了一般性问题:“除非%restrictions%”意味着不是每个声明都是一个定义。如果这些限制都不适用,这只是一个定义
如果你阅读这些限制,你会发现
它是一个类名声明
这回答了你的具体问题<代码>A类
是类名声明,但不是定义
我找不到标准中允许在声明性区域中重新声明类类型的部分
通常,根据C++11 3.3.1/4,可以在同一声明区域多次声明一个实体
给定单个声明区域中的一组声明,其中每个声明指定相同的非限定名称,它们都应引用同一实体,或[此处不相关的其他情况]
您的引用(来自C++11 3.1/2)回答了一般性问题:“除非%restrictions%”意味着不是每个声明都是一个定义。如果这些限制都不适用,这只是一个定义
如果你阅读这些限制,你会发现
它是一个类名声明
这回答了你的具体问题<代码>A类
是类名声明,但不是定义
我找不到标准的一部分