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; 
}