2013-05-05 81 views
0

我在編譯一個C++應用程序,它使用C庫和GCC 4.7。非局部變量在C++中使用匿名類型警告

當我編譯,我收到以下警告:

warning: non-local variable ‘const ptg_t param’ uses anonymous type 
warning: ‘typedef const struct<anonymous> ptg_t’ does not refer to the unqualified type, so it is not used for linkage 

C++爲什麼把它僞裝成警告,其中c不? 有沒有一種方法可以解決它,而無需更改定義了ptg_t param的庫頭文件?

+1

由於C++和C是具有不同規則的不同語言? – chris 2013-05-05 09:21:27

回答

3

C++的設計期望實現將使用類型名稱作爲損壞的符號名稱的一部分。 C的設計並不符合這種期望。

這是因爲C沒有函數重載,而C++卻沒有。在C++中,可以使用不同的實體具有相同的名稱,因此需要進行名稱修改。

所以在C++中,涉及匿名類型的外部屬於異常。

首選的方法是將C代碼編譯爲C,而不是C++。然後將它與其他C++程序鏈接起來。當包括從C++頭,做到這一點,如:

extern "C" { 
    #include "headername.h" 
} 

這值得重複:不編譯C代碼作爲C++。 C不是C++的子集,而且還有一些有效的C程序,它們也是有效的C++,但它們在C++中具有與C中不同的所需行爲。C++很容易從C移植到C,但它並不完全與C向後兼容。

+0

我試過用extern的建議,但警告仍在這裏。 – stdcall 2013-05-05 09:36:02

+0

@Mellowcandle:奇怪。一旦你遵循我的建議,編譯爲C++的唯一東西就是頭文件。如果在頭文件中定義了這個extern對象,那麼該庫存在一些嚴重錯誤,因爲這意味着如果同一個程序中的多個TU都使用該庫,那麼將會有多個對象定義(這是一個錯誤) 。如果是這種情況,那麼你可能需要修復庫。 – 2013-05-05 09:47:32

+0

或者,如果你真的無法修改它,儘管有源代碼,你可以在C中爲它編寫一個包裝器,公開提供相同接口但刪除了不友好對象的新頭文件。 – 2013-05-05 09:50:49