与extern“C”的C和C ++链接

时间:2012-07-20 14:02:51

标签: c++ c extern linkage

我在.h文件中定义了一个C ++函数,如下所示,并在.cpp文件中实现:

extern "C" void func(bool first, float min, float* state[6], float* err[6][6])
{
    //uses vectors and classes and other C++ constructs
}

如何在C文件中调用func?如何设置我的文件架构/ makefile来编译它?

谢谢!

4 个答案:

答案 0 :(得分:10)

您可以通过正常方式从C调用该功能。但是,您需要将extern "C"包装在预处理器宏中以防止C编译器看到它:

#ifndef __cplusplus
extern "C"
#endif
void func(bool first, float min, float* state[6], float* err[6][6]);

假设您正在使用GCC,然后使用gcc编译C代码,使用g++编译C ++代码,然后链接到g++

答案 1 :(得分:4)

要在C中调用它,您需要做的就是正常调用它。因为你告诉编译器使用C调用约定和使用extern "C"的ABI,你可以正常调用它:

func(args);

要编译,请将其用于C ++:

g++ -c -o myfunc.o myfunc.cpp

然后这是C:

gcc -c -o main.o somec.c

比链接:

g++ -o main main.o myfunc.o

确保该函数的C ++标头使用仅限C CONSTRUCTS 。因此,请在<vector>文件中添加.cpp之类的内容。

答案 2 :(得分:3)

使用

在C中调用它
func(... // put arguments here);

通过说extern“C”,你要求编译器不要破坏你的名字。否则,C ++编译器会倾向于在链接器之前修改它们(即添加其他符号以使它们唯一)。

您还需要确保使用C调用约定。

答案 3 :(得分:1)

//header file included from both C and C++ files

#ifndef __cplusplus
#include <stdbool.h> // for C99 type bool
#endif

#ifdef __cplusplus
extern "C" {
#endif

void func(bool first, float min, float* state[6], float* err[6][6]);

#ifdef __cplusplus
} // extern "C"
#endif

// cpp file
#include "the_above_header.h"
#include <vector>

extern "C" void func(bool first, float min, float* state[6], float* err[6][6]);
{
    //uses vectors and classes and other C++ constructs
}

// c file
#include "the_above_header.h"

int main() {
    bool b;
    float f;
    float *s[6];
    float *err[6][6];
    func(b,f,s,err);
}