如何從C調用一個名稱爲mangled的符號?C標識符限制
module.name:version
void* function(TypeSig); // Type of the function
我希望能夠使用C語言編寫的代碼路徑。函數調用約定大致相同。只是我必須在導出符號的版本和模塊路徑中進行修改,並且我具有與C一樣的標識符約定,因此我不能只使用下劃線。
如何從C調用一個名稱爲mangled的符號?C標識符限制
module.name:version
void* function(TypeSig); // Type of the function
我希望能夠使用C語言編寫的代碼路徑。函數調用約定大致相同。只是我必須在導出符號的版本和模塊路徑中進行修改,並且我具有與C一樣的標識符約定,因此我不能只使用下劃線。
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的字母。
標識符的類型是無趣的(因爲它總是相同的)。因此它做得更乾淨:_W6module4nameV1。無論如何,謝謝你展示這個。 由於後鏈接過程,只有`void * fn(TypeSig)`函數。 – Cheery 2008-12-15 19:45:00
module.name:version似乎不是C.你能否重新登錄它? – 2008-12-15 16:25:18