【问题标题】:C identifier limitsC 标识符限制
【发布时间】:2008-12-15 10:57:24
【问题描述】:

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

module.name:version

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

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

【问题讨论】:

  • module.name:version 好像不是 C,能重新标记一下吗?

标签: c dynamic-linking


【解决方案1】:

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) -functions。
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多