2014-10-27 57 views
2

我們已經在我們的系統中的一段C代碼包含這樣全球訪問幾個數組:爲extern「C」與常量

source.h

extern const int magic[5]; 

由source.c:

const int magic[] = { 1, 2, 3, 4, 5}; 

有人決定這將是改變這一到C是一個好主意++等在extern "C"塊以上結束了:

source.h:

extern "C" { 
    const int magic[5]; 
} 

source.cc:

extern "C" { 
    const int magic[] = { 1, 2, 3, 4, 5}; 
} 

這-Wall

沒有用gcc軋軋編譯直到有人試圖使用數組我們發現了這個問題。在extern "C"內使用const原因完全不會生成外部符號。這發生在gcc,sun workshop和ibm的編譯器中。

鑑於gcc並未警告您您正在做一些奇怪的事情,所以對於這是否爲預期行爲,我有些茫然。

所以這是標準規定的這種行爲,還是一個相當普遍的錯誤?

回答

8

const變量有內部聯繫(如果聲明爲static),除非您使用extern指定外部鏈接。如果您想將其定義在一個源文件中並從其他文件訪問,則需要外部鏈接。

這是除了使用extern "C"來指定語言鏈接。

extern "C" { 
    extern const int magic[5]; 
} 

您的C聲明正確指定了外部鏈接;但是當您更改爲C++時您將其刪除了。

+0

是的,這個行爲是在標準中指定的。一個在C++中使用的地方:http://stackoverflow.com/a/12043198/365496 – bames53 2014-10-27 17:07:43

+0

公平地說,沒有任何東西在源文件中被「刪除」;只有在頭部,'extern'消失了。 – 2014-10-27 17:30:53

+0

@LightnessRacesinOrbit:的確如此。但這足以打破聯繫。 – 2014-10-27 17:33:12