假设您有一个.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)。
答案 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"
}