2011-03-19 70 views
17

給定的C代碼不相容C和C++之間代碼

#include <stdio.h> 
int x = 14; 
size_t check() 
{ 
    struct x {}; 
    return sizeof(x); // which x 
} 
int main() 
{ 
    printf("%zu",check()); 
    return 0; 
} 

給出4在C輸出對我的32位實施方案,而在C++代碼

#include <iostream> 
int x = 14;  
size_t check() 
{ 
    struct x {}; 
    return sizeof(x); // which x  
} 
int main() 
{ 
    std::cout<< check(); 
    return 0; 
} 

輸出1爲什麼這種差異?

+1

可能的重複項:http://stackoverflow.com/questions/3451266/understanding-sizeofchar-in-32-bit-c-compilers http://stackoverflow.com/questions/119123/why-isnt-sizeof-for -a-struct-equal-of-sum-of-sizeof-of-each-member – phooji 2011-03-19 08:44:44

+2

@phooji:不,這不是重複的。 – 2011-03-19 08:46:26

+0

@Saurabh:你可能是對的 - 這些問題並不完全一樣,但我認爲答案是相關的(請參閱Prasoon的回答以及我對你的回答的評論)。 – phooji 2011-03-19 08:51:05

回答

25

在C++類聲明struct x {};介紹了名稱xcheck範圍和隱藏x(先前聲明爲int在文件範圍) 。你得到1作爲輸出,因爲size of empty class cannot be zero in C++

在C中,結構標記名稱的內部範圍聲明永遠不會隱藏外部範圍中的對象或函數的名稱。您需要使用標記名稱struct來指代類型名稱x(結構)。然而,你不能在C中有一個空的結構,因爲it violates the syntactical constraints on struct(然而gcc支持它作爲擴展)。

+3

+1,但也許應該強調一個事實,即在C++'struct x'中只隱藏該變量,因爲在外部範圍中聲明瞭'x'。如果他們被宣佈在同一個範圍內,他們會愉快地生活在一起*和* sizeof'的行爲將與C相同 – 2011-03-19 09:12:26

7

C代碼給出了全局變量'x'的大小,而C++代碼給出了空結構的大小。 爲了得到在C代碼的結構的x,使用sizeof(結構X)的大小

+0

你對於範圍界定問題是正確的,但並不是全部。特別是,現在問題變成:爲什麼'sizeof(struct x)'在C版本中產量爲0 :) – phooji 2011-03-19 08:52:51

+0

+1的速度。 – 2011-03-19 08:53:10

+0

@phooji:C中的空結構是違反約束的。 – 2011-03-19 08:53:38

0

在C中,我不認爲你可以直接使用它的名字來引用一個類型(即struct x)。您必須創建該類型的對象並在其上運行sizeof

在C++中,sizeof應用於類型名稱時將返回該類型的任何對象的大小。

7

在C中,結構標籤位於一個單獨的名稱空間中,並且必須使用struct關鍵字來訪問那裏的名稱。這就是「typedef struct {} x」成語在C語言中非常流行的原因 - 它允許您基本上將結構名稱提升爲全局名稱空間。

在C++中,相比之下,結構(以及所有其它名稱)生活在該命名空間周圍的聲明,而不是作爲SAURABH所述單獨的結構的標籤的名稱空間,如C.

,使用sizeof(結構x)的在C中,或者使用typedef struct {} x技巧使sizeof(x)像C++一樣工作。

作爲額外的好處,C++程序會輸出1,因爲具體的類對象必須具有非零大小(以便不同的對象必須具有不同的地址),因此編譯器使用匿名char值填充結構。