从C文件调用C ++函数
我是C和C ++的新手。 但我有一些C ++函数,我需要从C调用它们。我做了一个我需要做的例子
main.c :
#include "example.h" #include int main(){ helloWorld(); return 0; }
example.h :
#ifndef HEADER_FILE #define HEADER_FILE #ifdef __cplusplus extern "C" { #endif void helloWorld(); #ifdef __cplusplus } #endif #endif
example.cpp :
#include void helloWorld(){ printf("hello from CPP"); }
它只是不起作用。 我仍然在main.c
收到对_helloWorld
的未定义引用的错误。 这个问题在哪里?
简短回答:
example.cpp
应该包含example.h
。
更长的答案:
在C ++中声明函数时,它具有C ++链接和调用约定。 (实际上,最重要的特性是名称修改 – C ++编译器改变符号名称的过程,以便您可以使用在参数类型中具有相同名称的函数。) extern "C"
(存在于你的头文件是你的方式 – 它指定这是一个C函数,可以从C代码调用,例如。 没有被破坏。
你的头文件中有extern "C"
,这是一个很好的开始,但你的C ++文件不包含它,并且在声明中没有extern "C"
,因此它不知道将它编译为C函数。
extern "C"
告诉C ++声明的函数必须使用C ABI(应用程序二进制接口),因此,无论语言是C还是C ++,你的void HelloWorld()
总是在外部看到,因为它是C.
但是你在cpp文件中实现它就像它是C ++文件一样,C不知道。
你必须使HelloWorld
的原型同时适用于C和C ++,所以cpp文件应该将它声明为extern "C" void Helloworld() { /*your code here*/ }
,或简单地说,#include“example.h” “来自example.cpp,因此,在实现它之前,编译器已经知道它必须遵循C约定。