2011-02-25 84 views
1

剛開始K & R並在第二章,有一行:定義和變量聲明與價值

聲明列出的變量是 使用和狀態,他們有什麼類型和 也許他們的初始值是什麼

所以:

int x = 42定義

int x聲明也是一個定義因爲每個定義聲明

但是,當我們分配初值像K & R說,不說讓聲明一個定義

回答

2

你混淆了兩兩件事:

  1. 的聲明狀態(聲明)什麼對象的*類型,名稱和範圍是
  2. 的定義定義什麼對象的內容是

* object as in:變量,函數等,而不是OOP對象。

因此,定義通常也是一個聲明,因爲當您不聲明對象的類型時,您無法定義對象中的內容。最容易記住的只是:「每一個定義是一個聲明,但不是每一個聲明是一個定義」

對於變量

有隻1沒有定義的變量聲明方式:

extern typeX variable_name 

這告訴編譯器有一個名爲variable_name的變量,其類型爲typeX,但沒有獲取它的位置。 聲明一個變量的其他方法也是一個定義,因爲它告訴編譯器爲它保留空間並可能給它一個初始值。

所不同的是在結構和功能更加清晰:

對於結構

的聲明:

struct some_struct{ 
    int a; 
    int b; 
} 

這聲明some_struct到編譯器與A和B作爲結構體變量都類型爲int。

只有當你定義它們保留空間,你可以使用它們:

void foo(){ 
    struct some_struct s; 
    s.a = 1; // For this to work s needs to be defined 
} 

對於功能

不同的是更加清晰

聲明:

// This tells the compiler that there is a function called "foo" that returns void and takes void arguments 
void foo(); 

定義可能是像上面那個(在結構部分)

+0

這是如何回答我的問題? – user225312 2011-02-25 16:10:11

+0

事實上,你不能給變量聲明分配一個默認值,除非它也是一個定義。但正如我所說:有時這些術語被用作同義詞。 除非這是關於結構的一部分:當聲明所述結構時,可以將默認值賦給結構的變量。 – dtech 2011-02-25 16:59:13

1

基本上,你可以說一個聲明只是告訴編譯器,在那裏有一個具有該名稱和類型的變量。它確實會產生任何代碼,而在C中,這必須通過變量上的extern關鍵字完成。函數原型(沒有實現)也僅僅是聲明,並不需要extern關鍵字,但仍然可以提供它。定義產生代碼,例如爲堆棧分配內存或爲變量分配內存,或爲方法分配內存。

從這個意義上講,你的兩個表述都是定義,任何定義也是一個解釋。

我認爲用K & R A錯誤可能......