我想为C接口实现某种名称修改。我将有像
这样的功能和类型struct Foo;
struct Foo* Foo_create(struct Bar* bar);
void Foo_destroy(struct Foo* obj);
struct Foo_InnerClass;
...
现在,_在所有标准c typedef中都使用了扩展,因此如果使用这些typedef,该方案将无法正常工作。 GCC和MSVC似乎接受使用$的名称。那会有用吗?我可以使用其他任何接受的角色吗?
编辑:
我想这样做是因为
编辑2:
保留一封普通的信件会在任何地方编译,但也可能会令人困惑:
struct Foo* FooIcreate(struct Bar* bar);
编辑3:
符号可能因目标平台而异,但在该平台上,它不得与C ++名称重整冲突。
编辑4:
禁止使用数字开始标识符。那么:
struct Foo* Foo_1_create(struct Bar* bar);
答案 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
作为分隔符