12

我对 C 和 C++ 很陌生。但是我有一些 C++ 函数需要从 C 中调用它们。我举了一个例子来说明我需要做什么


主.c

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

int main(){   
    helloWorld();
    return 0;
}

例子.h

 #ifndef HEADER_FILE
 #define HEADER_FILE

 #ifdef __cplusplus
     extern "C" {
 #endif
         void helloWorld();
 #ifdef __cplusplus
     }
 #endif

 #endif

示例.cpp

#include <iostream.h>

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

它只是行不通。我仍然_helloWorld在我的main.c. 问题出在哪里?

4

2 回答 2

15

简短的回答:

example.cpp应包括example.h.

更长的答案:

当您在 C++ 中声明一个函数时,它具有 C++ 链接和调用约定。(实际上,最重要的特性是名称修饰——C ++ 编译器更改符号名称的过程,以便您可以拥有具有相同名称但参数类型不同的函数。) extern "C"(出现在您的头文件中)是你的方式 - 它指定这是一个 C 函数,可从 C 代码调用,例如。没有损坏。

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

于 2012-09-27T06:53:08.263 回答
2

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

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

您必须使HelloWorldC 和 C++ 的原型保持一致,因此 cpp 文件应将其声明为extern "C" void Helloworld() { /*your code here*/ },或者简单地说,来自 example.cpp 的 #include "example.h",以便在实现它之前,编译器已经知道它必须遵循 C 约定。

于 2012-09-27T07:00:47.973 回答