我指的是this線程,我有需要的extern「C」聲明同樣的要求(將函數調用包)。有什麼辦法用g ++標誌聲明函數爲extern「C」?
在我的情況下,這個原型是在一個單獨的頭文件中聲明,我不想改變這個頭文件或原始代碼文件(其中函數調用時)。 但我仍然希望編譯器將我的函數看作是extern「C」。 所以,我想知道是否有一種方法來提供這個信息與g ++標誌(例如像「--externc = foobar」)。
我指的是this線程,我有需要的extern「C」聲明同樣的要求(將函數調用包)。有什麼辦法用g ++標誌聲明函數爲extern「C」?
在我的情況下,這個原型是在一個單獨的頭文件中聲明,我不想改變這個頭文件或原始代碼文件(其中函數調用時)。 但我仍然希望編譯器將我的函數看作是extern「C」。 所以,我想知道是否有一種方法來提供這個信息與g ++標誌(例如像「--externc = foobar」)。
如果你想改變鏈接/調用約定(這就是extern "C"
有權做的事情),幾乎唯一的安全答案就是在聲明函數的地方改變它 - 例如:在標題中。否則,你可能會定義函數的定義與它所使用的不同,並且會出現鬧劇。
我認爲這是不容易可行的(到後聲明爲在以前的一些頭部聲明extern "C"
只有一個功能)。
如果你只有一個這樣的函數(並不是很多),我認爲最簡單的解決方案是改變頭部,或者在包含頭部之前聲明函數extern "C"
(如果簽名和參數或該功能的結果類型允許它,例如,如果在其他標題中定義了相關類型等)。
或者,寫一些(例如在sed
或awk
)腳本將會變換標題。
你也可以考慮定製GCC與例如一個以MELT(擴展GCC的域特定語言)編碼的擴展,它可以根據需要更改聲明的內部表示形式。我不確定這是值得在你的情況下的努力。
當包括通常需要用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假裝符號的聯動不同於它實際上不是做得比較工作。
但是,如果標題是真正的C++,例如這可能不起作用。如果它包含相同名稱但簽名不同的重載函數。 –
第二種解決方案(內聯函數)應該可以工作,我想。但由於OP做**不**想改變調用點,你還需要一個宏來打開'actual_function'呼叫源爲'call_as_c'(具有諷刺意味然後調用'actual_function')。 – Damon
@BasileStarynkevitch:正確。因此,如果我的答案是頭部碰巧是底部的C++頭部,那麼該怎麼辦。 –
這將幫助我們,如果你真的給了你想在這個問題修改實際函數的聲明代碼。 –