2008-12-15 48 views
0

如何從C調用一個名稱爲mangled的符號?C標識符限制

module.name:version 

void* function(TypeSig); // Type of the function 

我希望能夠使用C語言編寫的代碼路徑。函數調用約定大致相同。只是我必須在導出符號的版本和模塊路徑中進行修改,並且我具有與C一樣的標識符約定,因此我不能只使用下劃線。

+0

module.name:version似乎不是C.你能否重新登錄它? – 2008-12-15 16:25:18

回答

2

IIUC,您正在定義您自己的語言,並且正在尋找一個合適的名稱修改算法。

您可能想要使用Intel et.al. Itanium name mangling algorithm,在所有平臺上由g ++使用。對於特定的情況下,你可能會裂傷每個名字彷彿C++的申報

namespace module{ namespace name { namespace Vversion /*e.g. V1_0 */ { 
    void *function(int){} 
}}} 

這將裂傷作爲

_ZN6module4name4V1_08functionEi 

由於所有的符號使用的算法,它們無法與衝突彼此。它們也不能與名爲_ZN6module4name4V1_08functionEi的標準C函數衝突,因爲所有以_Z(或_UPPERCASE)開頭的名稱都被保留用於實現(C)。如果你想從g ++方便的調用,你可以使用這個精確的約定;否則你選擇一個不同於Z的字母。

+0

標識符的類型是無趣的(因爲它總是相同的)。因此它做得更乾淨:_W6module4nameV1。無論如何,謝謝你展示這個。 由於後鏈接過程,只有`void * fn(TypeSig)`函數。 – Cheery 2008-12-15 19:45:00