我在 .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 来编译它?
谢谢!
您以正常方式从 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++
。
要在 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
文件中包含类似的内容。
在 C 中使用
func(/* put arguments here */);
通过说 extern "C" 你是在要求编译器不要破坏你的名字。否则,C++ 编译器会倾向于在链接器之前破坏它们(即添加额外的符号以使它们唯一)。
您还需要确保已设置为使用 C 调用约定。
//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);
}