正如在标准中指定的,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到底是什么呢?
发布于 2014-05-14 14:12:37
它们在语法上都是有效的声明,但是这两个语句一起违反了one definition rule。编译器检测并报告此冲突。(它们都是声明和定义。)
发布于 2014-05-14 14:13:47
来自于标准
A declaration is a definition unless it declares a function without specifying the function’s bodya不是一个方法,所以int a意味着一个声明和定义。如果您在一个翻译单元中多次定义一个名称,您就违反了One definition Rule,因此出现了错误。
编辑
为了澄清,我发布了整个段落:
声明是一个定义,除非它声明了一个函数而没有指定函数体(8.4),它包含外部说明符(7.1.1)或链接规范(27) (7.5)并且既不是初始化器也不是函数体,它在类定义中声明静态数据成员(9.4),它是类名声明(9.1),或者是类型定义声明(7.1.3),使用声明(7.3.3),或使用指令(7.3.4)。
发布于 2014-05-14 14:42:49
就像两个人的名字一样。编译器会混淆引用哪一个。所以在同一范围内是不允许的。让两个变量具有相同的名称会让编译器感到困惑。
https://stackoverflow.com/questions/23646847
复制相似问题