2015-10-18 37 views
0

我目前正在閱讀一本關於C編程算法的書,我注意到,當作者要聲明/創建一個結構對象,他這樣做(結構已經通過的方式定義):使用關鍵字「結構」來聲明結構對象,並在malloc

struct hashTable * h; 

這:

struct hashTableNode ** table; 

即使調用malloc時,他這樣做:

h = malloc(sizeof(struct hashTable)); 

所以當我編寫代碼時,我嘗試了在上面的聲明中沒有使用'struct'這個詞來看它是否仍然有效,因爲這些結構已經被定義了。當然,他們確實工作。所以我的問題是爲什麼這些聲明中需要'struct',因爲它只是使得代碼行更長。這是絕對必要的嗎?還是隻是一些'安全'的技術,使代碼更兼容?

+3

您是使用真正的C編譯器還是實際使用C++編譯器? –

+1

我使用visual studio,所以我猜C++? –

+2

如果你想學習實際的C我建議使用C編譯器。在C和C++中,引用結構體的方式是不同的 - 儘管有些人總是用C語言結構化它們的結構體,所以他們不必繼續輸入'struct',即'typedef struct'成語。 –

回答

1

這取決於是否有typedef給這個結構的別名。當你發現相同的代碼沒有使用struct關鍵字時,它可能會調用你的結構的別名。

更具體地說,當沒有typedef,你必須給編譯器一個暗示,您的個人姓名hashTable是一個結構,這樣的:

struct hashTable{ 
    int a, b; 
}; 

int main() 
{ 
    struct hashTable t1; 
} 

人們經常使用typedef給該結構的別名雖然。在這種情況下,編譯器已經知道該別名實際上是您之前定義的結構,因此您不再需要關鍵字struct。下面的代碼將工作以及:

typedef struct hashTable{ 
    int a, b; 
}apple; 

int main() 
{ 
    apple t1; 
} 

最後,你必須找出爲什麼我們不給它的結構名稱作爲它的別名?所以,下面的代碼可能會最好:

typedef struct hashTable{ 
    int a, b; 
}hashTable; 

int main() 
{ 
    struct hashTable t1; 
    hastTable t2; 
} 

更新: 在C++中,實際上,你可以創建一個struct,並宣佈實例只是用你的結構的名稱。例如:

struct hashTable{ 
    int a, b; 
}; 

int main() 
{ 
    hashTable t1; 
}