c - 关于暂定定义

标签 c

我从一本关于暂定定义的书上看到,

A tentative definition is any external data declaration that has no storage class specifier and no initializer. A tentative definition becomes a full definition if the end of the translation unit is reached and no definition has appeared with an initializer for the identifier

请解释以上语句的含义。 另外,声明和定义之间的区别?由于这个,我混淆了。 :( 为什么这个程序不报错:

#include <stdio.h>

int a;      //Tentative definition
int a;      //similarly this declaration too.
int main()  //not getting any error with this code why its so?
{
    printf("hi");
} 

此外,这段代码有什么问题:

#include<stdio.h>
printf("Hi");
int main(void){
    return 0;
}

最佳答案

变量声明说,“程序中有一个具有以下名称和类型的变量”。

变量定义说,“亲爱的编译器先生,请立即为具有以下名称和类型的变量分配内存。”

所以同一个变量可以有多个声明,但应该只有一个定义。

在 C 中,纯声明(也不是定义)以关键字 extern 开头。因此,由于您在第一个示例中没有 this 关键字,所以您有两个定义。从表面上看,这似乎是一个问题(实际上是 C++ 中的一个错误),但是 C 有一个特殊的“暂定定义”规则,允许在同一个翻译单元中对同一个变量进行多个定义,只要它们都是匹配并且至多有一个初始化器。 C 编译器在后台将所有暂定定义合并为一个定义。

您是否尝试过初始化这两个定义,如下所示:

int a = 1;
int a = 2;

那么你就会出错。

你的第二个问题更直接。在 C 中,您根本无法在函数体之外拥有可执行语句。这是不允许的。想一想:如果允许的话,您希望它什么时候运行?

关于c - 关于暂定定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58589572/

相关文章:

c - 有没有办法编译Windows GUI,即tcc中的无控制台exe?

c - 指向静态定义的二维数组的指针

c++ - 从 Pulse Audio 运行简单的 C 程序时出错

c 宏,数组定义作为参数

c - 如何检查一个点是否在点簇内

c - C 宏的可选 [] 方括号

c - 除非我在开​​头声明变量,否则为什么会得到 "error undeclared identifier"?

android - 如果我导出 LD_LIBRARY_PATH,为什么 Android NDK 应用程序会崩溃

c - 为什么会出现段错误(核心转储)?

c - 结构体内部字段的 malloc