C编程中的声明和定义与extern

时间:2015-06-22 10:47:48

标签: c extern

这可能看起来很简单但是,这个问题在很多方面让我感到痒。

  1. 我的问题是关于c。

  2. 中变量的声明和辩护 实际上互联网上有很多关于这个问题的解释,并且这个问题不仅有一个解决方案,因为在这个问题上有许多观点。我想知道这个问题的明确存在。

    int a;
    

    这是一个声明或定义吗?这个当我使用printf时,它的0作为值{地址2335860。但是如果这个声明那么为此分配了内存。

    int a;
    int a;
    

    当我这样做时,它说先前声明了' a'在这里重新宣布' a'没有联系。

    1. 有些消息来源说c中允许重新声明,有些人说不是真的吗?

2 个答案:

答案 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;