是否只有C语言实现(私有)常量的命名约定?

时间:2016-01-03 00:34:40

标签: c naming

假设我正在编写一个名为my的库,它有一个模块myString

myString的公开公开函数和常量在myString.h中声明,具有以下约定:

typedef struct myString myString;
extern const size_t MY_STRING_MAX_LEN;
myString *my_string_new();

仅使用私有实现函数和结构成员在myString.c中声明,具有以下约定:

_grow_buffer(myString *this);
char *_buffer;

我的问题:是否存在类似的私有,仅实现常量的约定?

例如,_CHUNK_SIZE是我最初想要的。然后我读到C语言规范说不要在名称的开头使用下划线后跟一个大写字母,因为这些名称可能会在该语言的未来版本中使用。

我喜欢使用起始下划线约定,因为它消除了很多冗长。我可以使用MY_STRING_CHUNK_SIZE或某些变体,但这不是很漂亮的IMO。

2 个答案:

答案 0 :(得分:3)

在C语言中,带有链接的文件范围标识符(例如函数和变量名称)通过内部链接对转换单元进行私有。使用static存储类说明符指示内部链接:

static char *buffer;
static void  grow_buffer(my_string *str) { /* ... */ }

这并不能解决所有问题。在大型代码库中,可能存在多个标识符,例如grow_bufferbuffer。当你想要搜索buffer的定义时,给出六种可能性是很烦人的。

出于这个原因,在静态标识符上使用一些前缀约定仍然不是一个坏主意,例如在公共函数上使用相同的前缀。如果您决定将其分类从静态更改为外部,反之亦然,这也可以使您不必重命名标识符。

答案 1 :(得分:1)

那么,CHUNK_SIZE_怎么样?这个约定在C ++中很流行,因为它不会与“保留”_XX__XX

相混淆