2010-07-09 36 views
0

可能重複:
How does a compiled C++ class look like?結構的編譯定義如何在C中看起來像?

大家好,

bash$cat struct.c 
struct test 
{ 
int i; 
float f; 
}; 

bash$gcc -c struct.c 

目標文件struct.o是ELF格式的。我想了解這個對象文件包含什麼。源代碼只是一個結構的定義。這裏沒有可執行文件,所以文本中應該沒有任何內容,並且也沒有數據。 那麼struct的定義究竟在哪裏呢?

我試過使用;

readelf -a struct.o 
objdump -s struct.o 

但是不太明白這一點。

感謝,

Jagrati

+4

重複的[編譯的C++類如何看起來像?](http://stackoverflow.com/questions/3211262/how-does-a-compiled-c-class-look-like)由同一用戶發佈 – 2010-07-09 10:45:45

+0

真的,我只是想從C++轉移焦點,並理解一些更基本的結構。所以開始了一個新的帖子,擺脫以前的混亂。 – xyz 2010-07-09 11:04:44

回答

2

那麼struct 的定義真的在哪裏去?

結構定義通常爲/dev/null。 C沒有任何內省功能,所以在運行時不需要struct定義。編譯期間,對結構字段的調用將轉換爲數字偏移量,例如。 x->f將被編譯爲相當於*((void*)x + sizeof(int))。這就是爲什麼每次使用struct時都需要包含頭文件的原因。

+0

謝謝el.pescado。你在對這個問題的評論中解決了我的問題。 – xyz 2010-07-09 11:31:37

+0

你的意思是'*(float *)((char *)x + sizeof(int))'。指針運算和解除引用'void *'都是無效的。 – 2010-07-09 14:55:48

4

沒有什麼。它不存在。你什麼也沒創造,什麼也不用。

結構的定義在編譯時使用。該定義通常會放置在未編譯的頭文件中。這是當一個結構是使用一些代碼生成。該定義影響什麼編譯器產生的點。

除此之外,這也是爲什麼針對某個庫版本進行編譯,然後在運行時使用另一個版本會導致程序崩潰的原因。

+1

除了可能包含調試信息(如果您生成的話) - 儘管沒有使用它甚至可能不會去那裏。 – Rup 2010-07-09 10:48:30

+0

Hi Borealid, 的確,通常這樣的文件將作爲頭文件包含在內,不太可能自行編譯。但是說我編譯它並使用這個目標文件編譯另一個文件說main.c使用這個結構的定義(我可以做到這一點,對嗎?)。那麼在這種情況下,在目標文件struct.o中應該有一些東西,它告訴編譯main.c時struct.c中有什麼。 – xyz 2010-07-09 10:53:26

+1

@learnerforever:不,結構聲明*總是從頭文件中獲取。這就是爲什麼您必須始終包含頭文件的原因。 – 2010-07-09 10:59:02

2

結構不編譯,它們被聲明。函數得到編譯。

2

我不是專家,我實際上不能回答這個問題......但我想到了這一點。內存是內存:如果使用1個字節作爲整數或字符,它仍然是一個字節。結果僅取決於編譯器。 那麼,結構爲什麼不能相同呢?我的意思是,編譯器可能會計算內存分配(因爲你的計算機可能會分配內存的話,而不是字節,如果你的結構是1字節長,可能會添加3個字節,允許分配4字節的字),和那麼struct在訪問數據時就會成爲你的「參考」。 我認爲沒有必要在底層實際上有一些東西:編譯器足夠了解在編譯時,如果你引用了你的結構體的字段「name」,它應該把它當作一個長度爲字符的數組X.

正如我所說的,我並不擅長這樣的內部構件,但正如我所看到的,不需要將結構轉換爲「真實代碼」......它只是編譯器的註釋,編譯完成後可以銷燬。

+0

就是這樣; +1爲受過教育的猜測。 :) – 2010-07-09 10:51:49