簡體   English   中英

C ++中extern關鍵字的問題

[英]Problem with extern keyword in C++

以下兩個聲明之間的區別是什么? 我認為它們是等價的,但第一個樣本有效,第二個沒有。 我的意思是它編譯並運行,但位圖顯示代碼顯示為空白。 我還沒有介入它,但我錯過了一些明顯的東西嗎? GUI_BITMAP是一個描述位圖的簡單結構。 這適用於VC ++ 2005,但我認為它在VC ++ 2008中也失敗了。 抓住這個......

樣本1:

extern "C" const GUI_BITMAP bmkeyA_cap_active;
extern "C" const GUI_BITMAP bmkeyA_cap_inactive;

樣本2:

extern "C" 
{
   const GUI_BITMAP bmkeyA_cap_active;
   const GUI_BITMAP bmkeyA_cap_inactive;
};

編輯:更多的探索表明第二個例子是創建結構,而第一個例子是指外部結構。 第二個示例無法鏈接,因為全局范圍內有兩個具有相同名稱的變量。 但事實並非如此,它會向放棄的顯示代碼發送零填充結構。 嗯.....

編輯2:通過另一個編譯器(IAR)運行相同的代碼實際上無法在示例2上編譯,並且錯誤地缺少默認構造函數。 所以我猜測有一些關於“extern”關鍵字,結構和C ++的細微之處,我沒有得到。 如果外部區域的東西是功能,那么兩個樣本是否相同?

您的鏈接器可能會以靜默方式解析背后的重復符號。 您可能從供應商那里獲得靜態庫,並且必須將它們與您的程序鏈接 - 對於您有兩個這樣的庫並且它們都定義了一個公共符號的情況,解決方案是什么? 鏈接器將解決該問題,選擇一個或另一個定義,並讓您處理余波。 您是如何處理應用程序的鏈接階段的? 如果直接鏈接.o文件而不是在鏈接最終應用程序之前將它們放入中間庫,則可能會有更好的結果。

ARM文檔的這一頁很好地描述了問題 - 我希望在您的情況下發生類似的行為:

不一定檢測不同庫對象中的符號的多個定義。 一旦鏈接器找到了符號的合適定義,它就會停止尋找其他符號。 假設由於其他原因未加載包含重復符號的對象,則不會發生錯誤。 這是有意的,在某些情況下特別有用。

編輯:更多搜索已發現此問題是由於違反“ 一個定義規則 ”而導致的,因此編譯器/鏈接器不需要通知您該問題。 這使你的問題與這個問題重復。

第二個例子可能等同於第一個例子,在const前面有一個額外的extern。 在第一種情況下,編譯器可能結合了extern的兩種用法。 在第二種情況下,我會假設編譯器不會出於任何原因在外部范圍外部編寫所有內容。

暫無
暫無

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

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