以下声明是否也是定义?
int f(), i = 1;
如果我们像这样重写它,那么只有第二个声明是一个定义:
int f();
int i = 1;
c ++标准似乎将术语定义应用于整个声明,但对我来说,它似乎应该应用于声明的部分。
答案 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声明指定集合的解释和属性 标识符。标识符的定义是声明 该标识符:
- 对于一个对象,导致为该对象保留存储;
- 对于一个函数,包括函数体