多个声明符的声明 - 定义?

时间:2015-07-21 09:35:58

标签: c++ declaration language-lawyer definition

以下声明是否也是定义?

int f(), i = 1;

如果我们像这样重写它,那么只有第二个声明是一个定义:

int f();
int i = 1;

c ++标准似乎将术语定义应用于整个声明,但对我来说,它似乎应该应用于声明的部分。

3 个答案:

答案 0 :(得分:3)

每个声明者都被单独考虑定义或仅声明其标识符。

f()仅被声明。其他地方应该有一个定义。

i已定义。随后的声明需要使用extern来避免重新定义。

§3.1 C ++ 14标准中的声明和定义表示,

  

声明是一个定义,除非它声明一个函数而没有指定函数的主体,它包含extern说明符或...

该段落不断有相当多的规则和例外。它可能是标准中的一个缺陷,它没有提到那里的声明者,尽管讨论的功能并不是立即与整个声明有关。

我们也有§8/ 3,

  

声明中的每个 init-declarator 都会被单独分析,就好像它本身就在声明中一样。

这可以被解释为覆盖§3.1/ 2中规则的“传染性”。

答案 1 :(得分:1)

它们都是等同的陈述。在这两种情况下,它都是函数f()的声明和变量i的声明+定义。

答案 2 :(得分:-1)

此声明

int f(), i = 1;

包含两个声明和一个定义。也就是它声明了一个函数,它声明并同时定义了一个对象。

函数定义是包含其主体的函数声明。但是在上面的声明中,函数不包括它的主体。所以它只是一个函数f的声明,如果它是一个C声明,或者没有参数,如果它是一个C ++声明,参数数量未知。

对于变量i,此声明同时是变量的定义,因为内存是为类型int的相应对象保留的,而且保留的内存由整数常量初始化1

来自C标准(6.7声明)

  

5声明指定集合的​​解释和属性   标识符。标识符的定义是声明   该标识符:

     

- 对于一个对象,导致为该对象保留存储;

     

- 对于一个函数,包括函数体