假设我正在编写一个名为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。
答案 0 :(得分:3)
在C语言中,带有链接的文件范围标识符(例如函数和变量名称)通过内部链接对转换单元进行私有。使用static
存储类说明符指示内部链接:
static char *buffer;
static void grow_buffer(my_string *str) { /* ... */ }
这并不能解决所有问题。在大型代码库中,可能存在多个标识符,例如grow_buffer
和buffer
。当你想要搜索buffer
的定义时,给出六种可能性是很烦人的。
出于这个原因,在静态标识符上使用一些前缀约定仍然不是一个坏主意,例如在公共函数上使用相同的前缀。如果您决定将其分类从静态更改为外部,反之亦然,这也可以使您不必重命名标识符。
答案 1 :(得分:1)
那么,CHUNK_SIZE_
怎么样?这个约定在C ++中很流行,因为它不会与“保留”_XX
或__XX