4

我在 .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

4 回答 4

10

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

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

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

于 2012-07-20T14:07:12.133 回答
4

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

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文件中包含类似的内容。

于 2012-07-20T14:09:28.430 回答
3

在 C 中使用

func(/* put arguments here */);

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

您还需要确保已设置为使用 C 调用约定。

于 2012-07-20T14:06:58.807 回答
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);
}
于 2012-07-20T14:20:50.010 回答