C / C ++结构问题

时间:2011-08-20 10:57:18

标签: c++ c struct

假设您有一个.cpp文件(即使用像MSVC这样的C ++编译器编译)。在该文件中,您可以通过以下方式定义struct

struct Pixel
{
   float x, y;
};

在同一个文件中,您有一行代码将调用C函数,这需要C struct等于Pixel。如果你写:

Pixel my_pixel
// set my_pixel to something
c_func(&my_pixel);
它会起作用吗?我的意思是,C ++编译器将创建对象my_pixel,但它会将它传递给编译为C代码的函数(我只有该库的.lib)。

2 个答案:

答案 0 :(得分:5)

如果头文件是正确的,它将起作用,假设C编译器和C ++编译器使用兼容的调用约定。确保头文件具有包含函数定义的适当extern "C"块。

答案 1 :(得分:1)

David Schzwartz说你需要extern "C"块的原因是没有extern“C”块,编译器会在你调用它的时候“破坏”你正在调用的C函数的名称。如果您正在调用C函数而不是C ++函数,则函数库中的函数定义将没有错位名称,因此您的可执行文件将无法链接。

如果你调用的函数是用C ++编写的,那就是你想要的,因为名称修改允许函数名称重载。每个函数参数的类型都在受损函数名中紧凑编码。

名称修改最初是用C ++提供的,它允许C ++目标文件与遗留链接器链接,而不是必须提供一个C ++专用链接器,它明确支持重载函数。

C不允许函数名重载,因此C函数名永远不会被破坏。要为单个C函数提供C ++原型,请执行以下操作:

extern "C" Foo( int theInt );

如果你有一个完整的C函数原型的整个头文件,并且你想#include来自C ++源代码的头,那么将#include包含在一个extern C块中

extern "C" {
    #include "Foo.h"
}