2012-10-25 75 views
1

在下面的程序中,我嘗試將結構傳遞給函數。但我得到錯誤,我不明白爲什麼。我在這個計劃中犯了什麼錯誤?嘗試將結構傳遞給函數時出錯

我正在使用gcc來編譯這個c程序。

#include <stdio.h> 

struct tester { 
    int x; 
    int *ptr; 
}; 

void function(tester t); 

int main() { 
tester t; 
t.x = 10; 
t.ptr = & t.x; 
function(t); 
} 

void function(tester t) { 
    printf("%d\n%p\n",t.x,t.ptr); 
} 

錯誤:

gcc tester.c -o tester 

tester.c:8:15: error: unknown type name ‘tester’ 
tester.c: In function ‘main’: 
tester.c:12:2: error: unknown type name ‘tester’ 
tester.c:13:3: error: request for member ‘x’ in something not a structure or union 
tester.c:14:3: error: request for member ‘ptr’ in something not a structure or union 
tester.c:14:13: error: request for member ‘x’ in something not a structure or union 
tester.c: At top level: 
tester.c:18:15: error: unknown type name ‘tester’ 

:(!)如果我更換printfcoutstdioiostream,並命名擴展.cpp,我沒有得到任何錯誤。這是爲什麼 ?難怪我編譯使用g++

+0

關於您的編輯:如果文件擴展名爲「cpp」,gcc會將您的文件編譯爲C++代碼。請參閱http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b和http://stackoverflow.com/questions/5853664/whats-the-difference-between-gcc-and-g -gcc -c – halex

+1

關於「轉換」到C++,你會得到不同的結果,因爲C!= C++。在C'struct blah {}'中不會創建一個新類型,但是在C++中它確實(非常寬泛地說)。 – twalberg

回答

5

如果不同時的typedef聲明它像這樣,你必須在結構名稱前指定結構中的結構:

struct tester t; 

要麼你做,或者你做的以下:

typedef struct { 
    int x; 
    int *ptr; 
}tester; 

更新

下面是從亞當·羅森菲爾德從下面的報價發佈Difference between 'struct' and 'typedef struct' in C++?

在C++中,所有的結構/聯合/枚舉/類的聲明看起來好像是隱含Typedef的,只要名稱不與另一個同名的聲明所隱藏。

+0

請參閱編輯 –

+0

@SuhailGupta你的意思是你的筆記?它在C++中起作用的事實? –

+0

是我添加的筆記。 –

1

您的結構沒有命名。要麼使用struct tester t;或美國一個typedef

+0

請參閱編輯 –

+0

@SuhailGupta檢查弗洛林的答案,解釋它爲什麼在C++中起作用。 – Minion91

0

事情是你正在嘗試使用gcc編譯,這是一個「c語言」編譯器,並且你遵循C++風格的代碼。
可以通過structname variablename創建一個結構體變量;
但在C++中,你明確地告訴編譯器它是一個像
struct structname variablename; 只要做到這一點,你就會好起來的,否則你可以使用一個typedef,它基本上是你現在告訴編譯器表單,你會打電話給結構測試人員只有測試人員,這將更適合你,因爲你只需要一個小小的變化。