如何从C调用名称错位的符号?
module.name:version
void* function(TypeSig); // Type of the function
我希望能够在C语言中使用我的语言编写的代码路径。函数调用约定大致相同。只是我必须在我导出的符号中的版本和模块路径中进行修改,并且我具有与C相同的标识符约定,因此我不能只使用下划线。
答案 0 :(得分:2)
IIUC,您正在定义自己的语言,并且正在寻找合适的名称修改算法。
您可能想要使用英特尔等。 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不同的字母。