变量的声明与定义

时间:2018-12-03 01:31:02

标签: c++

请回答https://stackoverflow.com/a/19326873/10736710

我认为以下情况应该成立:

int x; //declaration
int y = 2; //definition

但是看起来首先是定义而不是声明。有人可以评论第一个定义吗?

2 个答案:

答案 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