请回答https://stackoverflow.com/a/19326873/10736710,
我认为以下情况应该成立:
int x; //declaration
int y = 2; //definition
但是看起来首先是定义而不是声明。有人可以评论第一个定义吗?
答案 0 :(得分:2)
标准(草稿)说:
[basic.def]
一个声明所声明的每个实体也由那个定义 声明,除非:
- (2.1)声明函数但未指定函数的主体([dcl.fct.def]),错误的
- (2.2)它包含外部说明符或链接规范20([dcl.link]),既不包含初始化程序也不包含函数体,
- (2.3)它在类定义([class.mem],[class.static])中声明了一个非嵌入式静态数据成员,
- (2.4)它在类定义之外声明了一个静态数据成员,并且该变量是使用constexpr在类内定义的 说明符(不建议使用此用法;请参见[depr.static_constexpr])
- (2.5)由详细类型说明符([class.name])引入,
- (2.6)这是一个不透明枚举声明([dcl.enum]),
- (2.7)它是模板参数([temp.param]),
- (2.8)它是函数声明符中的参数声明([dcl.fct]),而不是函数定义的声明符,
- (2.9)这是一个typedef声明,
- (2.10)这是一个别名声明([dcl.typedef]),
- (2.11)这是一个使用声明([namespace.udecl]),
- (2.12)这是一个演绎指南([temp.deduct.guide]),
- (2.13)这是一个static_assert-declaration([dcl.dcl]),
- (2.14)这是一个属性声明([dcl.dcl]),
- (2.15)这是一个空声明([dcl.dcl]),
- (2.16)这是一个使用指令([namespace.udir]),
- (2.17)这是一个显式的实例化声明,或者
- (2.18)这是显式专业化,其声明不是定义。
声明int x;
不是列出的任何例外,因此它是一个定义。
但是看起来首先是定义而不是声明。
int x;
是如引用规则所示的定义,这是正确的,但是从技术上讲,它不是声明是错误的-所有定义都是声明。您可以可以说它不是一个声明,或者您可以说它不是一个 forward 声明。
答案 1 :(得分:0)
定义:定义内容时会占用程序中的实际内存。当您执行int x;
时,即使变量已经统一,您已经占用了它的内存。
初始化:只有在同时定义某项内容时才能进行初始化。创建变量后,将已经为其分配了有效值。例如。 int x = 3;
x
现在已初始化并定义。
声明:如果声明某些内容,它实际上并不会占用应用程序中的内存,例如函数原型。如果您声明一个像void foo();
这样的函数,那么它只是编译器的简介,除非您定义它,否则不会占用应用程序中的内存。
分配:定义变量后,只要设置其值,就可以分配变量。因此,如果您这样做
int x;
x = 2;
您为x
分配了值2