簡體   English   中英

使用extern在C或C ++中包含文件

[英]Using extern to include files in C or C++

這在C或C ++中如何工作?

extern "C" {
#include <unistd.h>
#include <fd_config.h>
#include <ut_trace.h>
#include <sys/stat.h>
#include <sys/types.h>
}

C ++標准未指定編譯器應如何在其目標文件中命名符號(例如, Foo::bar()可能最終以__clsFoo_fncBar或某些gobbledygook __clsFoo_fncBar )。 C標准確實如此,並且它幾乎總是與C ++編譯器的方式不同(C不必處理類,名稱空間,重載等)。

結果,當您鏈接到C編譯器輸出的目標文件時,您必須告訴C ++編譯器查找名稱與C標准相對應的符號。 您實際上是將其置於“ C模式”。 這就是extern "C""C"部分所做的。

(或者,您可能還聲明了外部C對象文件可以使用的函數或變量。在這種情況下,這意味着以C方式導出這些符號。)

如果您的項目具有C和C ++源文件,並且您需要整體構建(C文件調用C ++文件中的某些函數),那么我們需要通過在C ++文件中聲明如下來保護C文件函數調用和符號:

extern“ C” {/ c文件中使用的符號 / uint8 GetCurrentthreadState(HANDLE ThreadId)

}

然后C ++編譯器生成與上述聲明的函數和符號的C編譯器相同的編譯輸出,因此在鏈接時間上,編譯器可以輕松鏈接C和C ++定義的符號而不會出現任何鏈接錯誤。

因此,我的意見不需要對編譯進行#ifdef __cplusplus檢查。 因為我們需要保護c ++文件中的符號對嗎? 另外C ++文件只能由C ++編譯器編譯嗎?

/ renjith g

它無法正常工作,您需要添加cplusplus預處理器...

#ifdef __cplusplus
extern "C" {
#endif

// your code


#ifdef __cplusplus
}
#endif

編輯:

在C ++中,名稱將像在C中一樣對待,這意味着將沒有mangle名稱。 它允許在庫中具有不同參數類型/數字或命名空間的兩個C ++不同函數之間進行區分(出於庫目的,libname.so,libname.a)。 如果名稱不正確,C程序將無法識別它

eg:
int myfction()
void myfunction(int)
void myfunction(int, char)

C library:   myfction

C++ library: int_myction (it depend on your compiler)
C++ library: int_myction_int (it depend on your compiler)
C++ library: int_myction_int_char (it depend on your compiler)
// ... which is not allowed in C program

每個C ++編譯器都需要支持外部的“ C”鏈接。 對於某些功能,此塊中的代碼可以是用C編寫的舊代碼,這是當前程序所必需的。

它的實現方式主要取決於編譯器,但是我聽說許多編譯器會禁用名稱改寫並更改調用約定。

暫無
暫無

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

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