2013-11-25 94 views
1

我指的是this線程,我有需要的extern「C」聲明同樣的要求(將函數調用包)。有什麼辦法用g ++標誌聲明函數爲extern「C」?

在我的情況下,這個原型是在一個單獨的頭文件中聲明,我不想改變這個頭文件或原始代碼文件(其中函數調用時)。 但我仍然希望編譯器將我的函數看作是extern「C」。 所以,我想知道是否有一種方法來提供這個信息與g ++標誌(例如像「--externc = foobar」)。

+0

這將幫助我們,如果你真的給了你想在這個問題修改實際函數的聲明代碼。 –

回答

1

如果你想改變鏈接/調用約定(這就是extern "C"有權做的事情),幾乎唯一的安全答案就是在聲明函數的地方改變它 - 例如:在標題中。否則,你可能會定義函數的定義與它所使用的不同,並且會出現鬧劇。

0

我認爲這是不容易可行的(到後聲明爲在以前的一些頭部聲明extern "C"只有一個功能)。

如果你只有一個這樣的函數(並不是很多),我認爲最簡單的解決方案是改變頭部,或者在包含頭部之前聲明函數extern "C"(如果簽名和參數或該功能的結果類型允許它,例如,如果在其他標題中定義了相關類型等)。

或者,寫一些(例如在sedawk)腳本將會變換標題。

你也可以考慮定製GCC與例如一個以MELT(擴展GCC的域特定語言)編碼的擴展,它可以根據需要更改聲明的內部表示形式。我不確定這是值得在你的情況下的努力。

4

當包括通常需要用extern "C"塊包裹它們,如果它們不具有相應的包裝物[有條件上__cplusplus]內的C頭:

extern "C" { 
#include <c-header.h> 
} 

嵌套這些塊是無害的不同之處在於它可以防止將頭部遷移到C++,即內部extern "C" - 塊是最佳選擇。如果標題是一個C++頭你需要跳theough轉發功能:

extern "C" void call_as_c() { 
    actual_cxx_function(); 
} 

Sinply假裝符號的聯動不同於它實際上不是做得比較工作。

+0

但是,如果標題是真正的C++,例如這可能不起作用。如果它包含相同名稱但簽名不同的重載函數。 –

+1

第二種解決方案(內聯函數)應該可以工作,我想。但由於OP做**不**想改變調用點,你還需要一個宏來打開'actual_function'呼叫源爲'call_as_c'(具有諷刺意味然後調用'actual_function')。 – Damon

+0

@BasileStarynkevitch:正確。因此,如果我的答案是頭部碰巧是底部的C++頭部,那麼該怎麼辦。 –

相關問題