2013-02-27 55 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++。