C中的手动名称修改

时间:2012-10-23 11:46:51

标签: c identifier name-mangling

我想为C接口实现某种名称修改。我将有像

这样的功能和类型
struct Foo;
struct Foo* Foo_create(struct Bar* bar);
void Foo_destroy(struct Foo* obj);
struct Foo_InnerClass;
...

现在,_在所有标准c typedef中都使用了扩展,因此如果使用这些typedef,该方案将无法正常工作。 GCC和MSVC似乎接受使用$的名称。那会有用吗?我可以使用其他任何接受的角色吗?

编辑:

我想这样做是因为

  • 避免重复名称
  • 它强调标识符所属的类
  • 可以自动生成C ++接口

编辑2:

保留一封普通的信件会在任何地方编译,但也可能会令人困惑:

struct Foo* FooIcreate(struct Bar* bar);

编辑3:

符号可能因目标平台而异,但在该平台上,它不得与C ++名称重整冲突。

编辑4:

禁止使用数字开始标识符。那么:

struct Foo* Foo_1_create(struct Bar* bar);

5 个答案:

答案 0 :(得分:1)

不确定为什么要这样做,或者确切地说是目标是什么,但是大多数C库使用一些或多或少的助记符前缀。

普通$会很糟糕,因为它是a)非常罕见,C标识符通常以字母或下划线开头,只包含字母,数字和下划线,b)没有说明什么是符号属于。

像glib这样的库的所有函数都有g_前缀,其类型为g,宏为G_。 GTK +类似,它使用gtk_等等。

答案 1 :(得分:1)

请勿使用$。 C标准不允许它们使用标识符,即使像GCC这样的C编译器接受它们与1980年代C编译器(大多数是VAX / VMS C,我相信)的向后兼容性。

如何使用双下划线?

struct Foo__InnerClass;

编辑:好的,这可以防止你的程序在混合的C / C ++程序中工作(参见C++ underscore rules),所以这是一个坏主意。尾随下划线怎么样:

struct Foo_InnerClass_

答案 2 :(得分:1)

没关系,虽然我喜欢使用struct Foo_t来表明它是一种类型。

我的偏好是保留双_(__)表示特殊或“私人”指示,而不是常规使用。这是纯粹的个人偏好,尽管任何本地编码标准都可能对此主题有所说明。

$ isfy ...虽然有些编译器接受它但有些却没有。它不是C语言的历史部分。虽然在某些操作系统和语言中很常见,但在其他操作系历史:IBM大型机的三大历史特色是$,#和@,其中_不是俱乐部的成员,VMS喜欢$。

答案 3 :(得分:0)

它不会在标识符中使用美元符号,因为它是:

  • 不常见,我没看到任何地方
  • 由于第一个原因,它会使您的代码的用户感到困惑,甚至可能会混淆某些工具,编辑等。
  • 所有目标都不支持,例如:

    echo 'void foo$bar(void) { }' | arm-elf-gcc -xc -c -
    

    输出:

    <stdin>:1: error: stray '$' in program
    <stdin>:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'bar'
    

我个人会使用某种模块前缀,就像你的第一个代码片段一样。如果您害怕与其他库发生名称冲突,则可以添加一个全局前缀,例如mylib_foo_create

答案 4 :(得分:0)

缺乏更好的闷热,我想我会用

_1

作为分隔符