0

如何从 C 中调用名称损坏的符号?

module.name:version

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

我希望能够使用用我的 C 语言编写的代码路径。函数调用约定大致相同。只是我必须在导出的符号中修改版本和模块路径,并且我具有与 C 相同的标识符约定,因此我不能只使用下划线。

4

1 回答 1

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

由于您的所有符号都使用该算法,因此它们不能相互冲突。它们也不能与名为 的标准 C 函数冲突_ZN6module4name4V1_08functionEi,因为所有以 _Z(或 _UPPERCASE)开头的名称都保留用于(C)实现。如果你想方便地从 g++ 调用,你可以使用这个确切的约定;否则你选择一个不同于 Z 的字母。

于 2008-12-15T13:38:18.977 回答