0

在下面的语句前三个是定义和最后一个是声明:变量声明和数据类型

auto int i; 

static int j; 

register int k; 

extern int l; 

什么是对同一原因呢?

+1

最后一个告诉'INT l'被定义在其他地方的编译器和链接器会找到它。 –

+0

这个问题实际上是关于* definition *和* declaration *之间的区别的吗? –

+0

@FelixPalmen是 –

回答

1

前三位(int i,静态int j,寄存器int k)是一个定义。它表示整数的空间位于该翻译单元中,并建议链接器将所有对i的引用链接到该实体。如果您的确有多个或少于这些定义中的一个,链接器将会投诉。

但是在最后的extern int l是一个声明,因为它只是引入/指定l,没有新的内存地址/空间被分配。您可以根据需要在每个编译单元中添加尽可能多的外部整数。 A 声明将名称引入翻译单元或重新声明先前声明引入的名称。

+0

正好一次......在全局范围内定义一个(n未初始化的)变量两次是非常合法的,例如'int i; int i;' –

+0

在C中,int i;在文件范围内(任何函数之外)是一个声明和一个试探性的定义。允许有多个试探性定义;只允许一个定义。 –

1

我认为问题是有关条款声明和C.

  • 一个声明告诉编译器的名称和“东西”型定义

  • 一个定义是一个声明,但还“创造”了“东西”即宣告。例如。对于一个变量,这会为这个变量引入一些存储空间。

在前三个例子中,变量实际上是创建的。存储类别auto,staticregister都只是指定存储持续时间。相反,存储类extern告诉编译器该变量是已知的,但它可能存在于不同的转换单元中。

也许比较声明和功能定义会使概念更容易的例子就明白了:

// function declaration: 
int foo(int x); 
// (now we know a function foo should be "somewhere", but it doesn't exist yet) 

// function definition: 
int foo(int x) { 
    return x+1; 
}