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

Asw*_*sad 2 c extern

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

  1. 我的问题是关于c中变量的声明和辩护.

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

int a;
Run Code Online (Sandbox Code Playgroud)

只是拿这个是一个声明或定义?,这个当我使用时printf,它具有0作为值和地址2335860.但是如果这个声明那么为此分配内存的方式.

int a;
int a;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它说先前的'a'声明在这里并重新声明'a'没有联系.

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

Moh*_*ain 5

int a; 这个是宣言还是定义?

int a;如果写在全球范围内是一个暂定的定义.这意味着如果当前编译单元中没有其他定义可用,则将其视为定义,否则这是一个声明.

6.9.2 C11规范中的外部对象定义:

具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明 构成暂定定义.如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于0.

int i4; // tentative definition, external linkage
static int i5; // tentative definition, internal linkage
Run Code Online (Sandbox Code Playgroud)

因此,您实际上正在进行多个声明,但由于暂定定义规则而获取地址和值.

一些消息来源说c中允许重新声明,有些人说不是真的是什么?

允许重新申请C.但重新定义不是.

相关问题:定义和声明之间有什么区别?

在互联网上实际上有很多解释

喜欢一本好书而不是互联网来掌握语言.您可以从以下方面选择一本好书: The Definitive C Book Guide and List