如何从 C 中调用名称损坏的符号?
module.name:version
void* function(TypeSig); // Type of the function
我希望能够使用用我的 C 语言编写的代码路径。函数调用约定大致相同。只是我必须在导出的符号中修改版本和模块路径,并且我具有与 C 相同的标识符约定,因此我不能只使用下划线。
如何从 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
由于您的所有符号都使用该算法,因此它们不能相互冲突。它们也不能与名为 的标准 C 函数冲突_ZN6module4name4V1_08functionEi
,因为所有以 _Z(或 _UPPERCASE)开头的名称都保留用于(C)实现。如果你想方便地从 g++ 调用,你可以使用这个确切的约定;否则你选择一个不同于 Z 的字母。