1

我想为 C 接口实现某种名称修饰。我将拥有类似的功能和类型

struct Foo;
struct Foo* Foo_create(struct Bar* bar);
void Foo_destroy(struct Foo* obj);
struct Foo_InnerClass;
...

现在,_ 在所有标准 c 类型定义中都广泛使用,因此如果使用这些类型定义,该方案将无法正常工作。GCC 和 MSVC 似乎接受使用 $ 的名称。那行得通吗?还有其他我可以使用的接受字符吗?

编辑:

我想这样做是因为

  • 它避免了重复的名称
  • 它强调标识符属于哪个类
  • 它使自动生成C++接口成为可能

编辑2:

保留一个普通的字母会到处编译,但它也可能令人困惑:

struct Foo* FooIcreate(struct Bar* bar);

编辑 3:

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

编辑4:

禁止以数字开头的标识符。那么呢:

struct Foo* Foo_1_create(struct Bar* bar);
4

5 回答 5

1

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

普通的$会很糟糕,因为它 a) 非常不常见,C 标识符通常以字母或下划线开头,并且只包含字母、数字和下划线,并且 b) 没有说明符号所属的任何内容。

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

于 2012-10-23T11:50:33.580 回答
1

不要使用$. C 标准不允许在标识符中使用它们,即使 GCC 等 C 编译器接受它们是为了与 1980 年代的 C 编译器(我相信主要是 VAX/VMS C)向后兼容。

如何使用双下划线?

struct Foo__InnerClass;

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

struct Foo_InnerClass_
于 2012-10-23T11:52:39.543 回答
1

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

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

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

于 2012-10-23T12:09:34.590 回答
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.

于 2012-10-23T12:00:10.537 回答
0

由于缺乏更好的解决方案,我想我会使用

_1

作为分隔符

于 2012-10-23T14:06:29.237 回答