标准int a
中指定属于简单declaration
。实际上
simple-declaration:
decl-specifier-seq_opt init-declarator-list_opt ; //
attribute-specifier-seq decl-specifier-seq_opt init-declarator-list ;
type-specifier:
trailing-type-specifier //
class-specifier
enum-specifier
trailing-type-specifier:
simple-type-specifier //
elaborated-type-specifier
typename-specifier
cv-qualifier
simple-type-specifier:
nested-name-specifieropt type-name
nested-name-specifier template simple-template-id
char
char16_t
char32_t
wchar_t
bool
short
int //
long
signed
unsigned
float
double
void
auto
decltype-specifier
因此int a
是一个简单的声明。但是,如果我们将a
重新声明为与以下相同的范围:
int a;
int a;
我们有
test.cpp:4:5: error: redefinition of ‘int a’
test.cpp:3:5: error: ‘int a’ previously declared here
究竟int a
究竟是什么?
答案 0 :(得分:9)
它们都是语法上有效的声明,但两者一起违反了one definition rule。编译器检测并报告此违规。 (它们都是声明和定义。)
答案 1 :(得分:6)
来自标准
A declaration is a definition unless it declares a function without specifying the function’s body
a
不是方法,因此int a
表示声明和定义。如果您在一个翻译单元中多次定义名称,则违反One definition Rule,因此会出错。
修改强>
为了澄清,我发布了整个段落:
声明是一个定义,除非声明没有的函数 指定函数的主体(8.4),它包含extern 说明符(7.1.1)或链接规范(27)(7.5),既不是 初始化器也不是函数体,它声明了一个静态数据成员 类定义(9.4),它是一个类名声明(9.1),或它 是一个typedef声明(7.1.3),一个using声明(7.3.3),或者一个 使用指示符(7.3.4)。
答案 2 :(得分:0)
与同名的两个人相同。编译器会混淆哪一个引用。因此,不允许在同一范围内。拥有两个具有相同名称的变量会让编译器感到困惑。
答案 3 :(得分:0)
我们使用声明来声明变量名称和类型以及为它们定义内存。大多数情况下,这两个动作同时发生,即大多数声明都是定义(如果是变量而不是函数)。因此错误。然而,情况可能并非总是如此。