从C文件调用C ++函数

时间:2012-09-27 06:50:18

标签: c++ c merge call

我对C和C ++很陌生。但我有一些C ++函数,我需要从C中调用它们。我做了一个我需要做的例子


main.c中

#include "example.h"      
#include <stdio.h>

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 <iostream.h>

void helloWorld(){
    printf("hello from CPP");
} 

它不起作用。我仍然在_helloWorld中收到main.c未定义引用的错误。这个问题在哪里?

2 个答案:

答案 0 :(得分:14)

简短回答:

example.cpp应包含example.h

更长的答案:

在C ++中声明函数时,它具有C ++链接和调用约定。 (实际上,最重要的特性是name mangling - C ++编译器改变符号名称的过程,这样你就可以拥有参数类型不同的同名函数。){{1} (存在于头文件中)是你的方式 - 它指定这是一个C函数,可以从C代码调用,例如。没有被破坏。

你的头文件中有extern "C",这是一个好的开始,但你的C ++文件不包括它,并且在声明中没有extern "C",所以它不知道编译它作为C函数。

答案 1 :(得分:2)

extern "C"告诉C ++声明的函数必须使用C ABI(应用程序二进制接口),因此,无论语言是C还是C ++,您的void HelloWorld()总是在外部看到,因为它是下进行。

但是你在cpp文件中实现它就像它是C ++文件一样,C不知道。

你必须使HelloWorld的原型同时适用于C和C ++,因此cpp文件应该将其声明为extern "C" void Helloworld() { /*your code here*/ },或简单地说,#example“example.h”中的“example.h”因此,在实现它之前,编译器已经知道它必须遵循C约定。