2015-01-21 73 views
0

此前我們已經使用malloc動態內存分配,爲什麼變量名稱和數據類型名稱被允許使用函數但不包含關鍵字?

struct node* node = (struct node*) malloc(sizeof(struct node)); 

它工作得很好。

雖然做再保理我把它改成,

struct node* node = new node; 

,這讓我的錯誤,

錯誤1個錯誤C2061:語法錯誤:標識符 '節點'

爲什麼同一個變量node名稱與函數(malloc)正常工作,但不適用於(新)。

我使用Visual Studio 2012

回答

2

的問題是:

struct node* node = new node; 
      ^^^^ 

只要編譯器看到劃線部分,令牌node指變量。因此,當它處理new node時,它是new name_of_a_variable,這是沒有意義的。要解決這個問題,你可以調用你的變量有點不同(這是一個好主意)。

malloc版本沒有問題,因爲您從不使用node自己,您始終使用struct node這是明確的類型名稱。

+0

編譯器不應該理解上下文嗎? – 2015-01-21 04:52:25

+1

不可以。您只能在同一範圍內爲標識符指定一個含義。有時會超過另一個(「陰影」),有時會導致編譯器錯誤。 – 2015-01-21 04:55:38

0

確認對方的回答(這說,這是使用的是啓用了您malloc例如編譯關鍵字 struct的), 這個程序編譯和使用運行在https://ideone.com C++ 14:

#include <iostream> 
struct node { int x; }; 
int main() 
{ 
    struct node* node = new struct node; 
    node->x = 1; 
    std::cout << node->x << std::endl; 
    return 0; 
} 

所以你可以使用struct node作爲你的 特別的例子中一個明確的類型名稱。無論您使用nodenewmalloc,它確實是同樣的問題和解決方案 。

但正如已經指出的那樣,最好爲您的類型和變量選擇不同的名稱。

相關問題