簡體   English   中英

從C文件調用C ++函數

[英]Calling C++ functions from C file

我是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");
} 

它只是不起作用。 我仍然在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約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM