簡體   English   中英

放置#ifdef __cplusplus extern“C”的最佳位置在哪里{#endif

[英]Where is the best place to put the #ifdef __cplusplus extern “C” { #endif

我想知道哪里更好

#ifdef __cplusplus
extern "C" {
#endif

在C頭文件中。

在開始或之后所有其他包括。 為什么?

對此沒有嚴格的規定,但請注意以下內容。

  1. 一般原則是每個頭文件都自己處理(並且是自給自足的)。 因此,根據這個原則,不需要將頭文件包裝在extern“C”中,因為頭文件中會有一個extern“C”(如果需要的話)。 因此,在當前文件中,您可以將其放在另一個包含之后。
  2. 但是,如果你有一大堆標題,你不想添加一個extern“C”,並希望通過單個include提供,無論如何,繼續將它們包裝在一個文件中廣泛的“C”。

只知道extern“C”背后的想法是它使編譯器生成C友好鏈接。 否則,使用C ++編譯器編譯的代碼會查找在使用C編譯器編譯的存檔中鏈接的錯位名稱,並且無法找到它們。

此構造用於使您的名稱可用於C鏈接器(簡短說明)

顯然你只想在你的東西周圍使用它。

像這樣 :

#ifndef MY_INCLUDE_H_ // include guard
#define MY_INCLUDE_H_

#include <...> // dependencies
#include "..."

#ifdef __cplusplus
extern “C” {
#endif

// ... your types, methods, variables

#ifdef __cplusplus
}
#endif

#endif // MY_INCLUDE_H_
  • 外部“C”影響聯系。 當編譯C ++函數時,它們的名稱會有所不同,這就是為什么在C ++中進行重載是可能的。 因此,函數名稱會根據參數的類型和數量進行修改,因此具有相同名稱的兩個函數將具有兩個不同的符號名稱。

  • extern“C”中的代碼仍然是C ++代碼。 你可以在extern“C”塊中做些什么,但它們都是關於鏈接的。

extern "C"會影響代碼的編譯方式。 設計為C和C ++編譯的標頭將自己管理extern "C" 永遠不應該在一個extern "C"塊中包含一個#include指令:如果所涉及的頭被設計為雙向編譯你的指令是多余的,如果它不是設計為雙向使用它是一個錯誤。

暫無
暫無

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

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