这可能看起来很简单但是,这个问题在很多方面让我感到痒。
我的问题是关于c。
int a;
这是一个声明或定义吗?这个当我使用printf
时,它的0
作为值{地址2335860
。但是如果这个声明那么为此分配了内存。
int a;
int a;
当我这样做时,它说先前声明了' a'在这里重新宣布' a'没有联系。
有些消息来源说c中允许重新声明,有些人说不是真的吗?
答案 0 :(得分:5)
int a;
这是一个宣言或定义?
int a;
如果在全球范围内编写是一个暂定的定义。这意味着如果当前编译单元中没有其他定义可用,则将其视为定义,否则这是一个声明。
来自C11规范中的 6.9.2外部对象定义:
具有文件范围的对象的标识符声明 没有初始值设定项,没有存储类说明符或带有 存储类说明符static,构成暂定 定义即可。如果翻译单元包含一个或多个暂定单元 标识符的定义,翻译单元包含 no 该标识符的外部定义,然后行为完全正确 好像翻译单元包含一个文件范围声明 标识符,在翻译结束时使用复合类型 单位,初始化程序等于0。
int i4; // tentative definition, external linkage static int i5; // tentative definition, internal linkage
因此,您实际上正在进行多次声明,但由于暂定定义规则而获取地址和值。
有些消息来源说c允许重新声明,有些人说不 什么是真相?
C
允许重新声明。但重新定义不是。
相关问题:What is the difference between a definition and a declaration?
互联网上实际上有很多解释
选择一本好书而不是互联网来掌握语言。您可以从以下位置选择一本好书: The Definitive C Book Guide and List
答案 1 :(得分:0)
int a
is a definition and can be used in place of declaration. A variable can have many declarations but must have only one definition. In case of
int a;
int a;
there are two definition of a
in the same scope. Providing linkage to one of them will make your compiler happy
int a;
extern int a;