2013-02-27 49 views
2

在這個項目中,我需要從C文件中獲取頭文件中結構的大小。混合C/C++源代碼:在C代碼中獲取sizeof(C++ struct)

因爲結構包含這不會C.

任何想法編譯類,我不能包括在C文件中的頭文件?

+0

將C源代碼重寫爲C++源代碼並使用C++編譯器進行編譯。 – pmg 2013-02-27 21:00:54

+1

我認爲C++常見問題解答全稱是http://yosefk.com/c++fqa/mixing.html – 2013-02-27 21:05:27

回答

5

你可以宣佈在.h文件:

extern const size_t SIZE_OF_MY_STRUCT; 

而在.cpp文件中定義SIZE_OF_MY_STRUCT爲:

extern const size_t SIZE_OF_MY_STRUCT = sizeof(MyStruct); 

所以,你會不會有一個函數調用的開銷。

5

在C++提供了效用函數:

extern "C" size_t ReturnSizeOfMyStruct(void) { 
return sizeof(MyStruct); 
} 

然後調用它在C代碼:

extern size_t ReturnSizeOfMyStruct(void); 
size_t howBig = ReturnSizeOfMyStruct(); 
+0

如果有人想用更正確/更準確的術語取代「POD」,請隨意。 – 2013-02-27 21:03:22

+0

There :)它現在更精確 – anatolyg 2013-02-27 21:08:12

+0

爲什麼在.c文件中的.h文件和'extern const size_t SIZE_OF_MY_STRUCT = sizeof(MyStruct)'中的'extern const size_t SIZE_OF_MY_STRUCT'? – kay 2013-02-27 21:11:32

1

如果struct實際上是用C++特性(成員函數,private/protected /構造函數和/或析構函數繼承自另一個類/結構)[或者具有使用這些特性的成員],那麼你沒有太多選擇:

  1. 編寫一個返回大小的函數,該函數編譯爲C++,但調用約定爲extern "C"
  2. 重組您的代碼,以便您不需要以其他方式在您的C代碼中使用sizeof(C++結構體)。
  3. 更改您的C代碼,使其與C++兼容並使用C++編譯器進行編譯。

在上面的主題中可能會有一些其他變體,但本質上,假設它是一個「C++結構」,不能用C編譯,你堅持用C++友好的方式修復它。顯然,如果C++結構沒有使用任何C++特性 - 它只是一個普通的舊數據,那麼解決方案顯然是將結構移出當前標題並將其放入可包含在標題中的標題C和C++。