我在.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来编译它?
谢谢!
答案 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);
}