C/C++标准库的命名规范名称是什么?

34

我想知道C/C++标准库中使用的命名约定是否有名称,或者至少有一个可以查找规则的备忘单。例如:

push_back    -- underscore used
setstate     -- but not used here!
string::npos -- when to use abbreviations?
fprintf
...

C/C++标准库中使用的命名规范有特定名称吗?


13
同时,std::ios_base::Init 的奇怪大写字母 o_O。 - Johannes Schaub - litb
什么?!大写字母也要用啊!:P - Khaled Alshaya
49
它被称为“本周我们碰巧想到的任何东西”。 - Paul Tomblin
3
Rob Pike曾参与C语言的早期历史,他对变量名有这样一番话,或许会让你感兴趣:http://doc.cat-v.org/bell_labs/pikestyle - Roger Pate
也许我们应该区分C和C++标准库? - GooseDeveloper
6个回答

34

C/C++使用著名的捏造式命名约定。一般而言,您可以关于C/C++标准库命名约定唯一确定的事情是它不使用驼峰式命名(除了C++ STL模板类型名称),它使用小写类和函数名称,并且(有时)使用下划线分隔单词。但下划线的使用更多地是C++的事情;特别是C倾向于缩写单词,例如strlenmemcpy。这可能是UNIX早期使用非常简洁的名称来表示事物的倾向的结果。


24
对事物使用非常简短的名称的倾向可能由以下因素之一导致:80个字符或更小终端;编译器资源限制;对霍夫曼编码宇宙的内在渴望;或以上所有因素的影响。 - Steve Jessop
25
早期的编译器只考虑符号的前6个字符是显著的,以便与Fortran兼容。例如,符号 strlenstrlenxyzstrlenohmygodwhathaveidone 都指代相同的东西。因此,为了与早期的ANSI编译器兼容,ANSI C标准确保所有标准库符号的前6个字符在彼此之间是唯一的。 - Adam Rosenfield

9

C标准库有明确定义的规则,您必须遵循以避免名称冲突。不过我对C++一无所知。

如果您认为这很混乱,那么您应该查看PHP库...


链接加1。你可能没有意识到,有比你想象中更多的名称被保留,例如以“_t”结尾的类型。 - u0b34a0f6ae
@kaizer:据我所知,保留“_t”是POSIX的限制。 - Christoph
是的。C语言只保留以uintint开头并以_t结尾的类型名。 - Johannes Schaub - litb

6

我认为不同时间由不同人发明的几个组使用略有不同的约定:C库、流、字符串、STL(容器+算法+迭代器)。我感觉后者可能被视为“惯例”,这为boost和C++0x命名等事物设定了榜样。


4

可悲的事实是 - 实际上并没有真正的规则。

以stdio函数的参数顺序为痛苦的提醒。


3
实际上,这其中有一个很好的原因。采用传统的C函数调用ABI,在调用多个函数时,如果它们最后一个参数相同(例如 for (i = 0; i < n; i++) { fputs(s[i], stdout); fputc('\n', stdout; }),与第一个参数不变相比较,要更加经济高效。然而,对于像printf这样的可变参数函数,固定参数必须位于参数列表的开头。 - ephemient

0

我没有答案,但至少我不认为C和C++使用相同的命名约定。


类似于fprintf、strlen、itoa(令人发抖)这样的东西来自C库。它们有小写、无下划线和大量缩写的约定。C库是以“c”开头的C++库:cstdio、cstring、cmath等。 - UncleBens
C有一个名为strpbrk的函数,而C++有一个名为sync_with_stdio的函数,而不是swstdio :) - Johannes Schaub - litb

0

我认为这两种命名约定都没有一个名称。

C和C++标准中的命名约定是不同的,尽管有些微妙的关联。

特别是,在C库中,没有任何函数或宏名称包含下划线(据我所知),而C++库则不同。

大多数C库命名约定都受先例控制;它标准化了现有的实践(大约在1984年左右),并且发明的很少(通过<locale.h>处理区域设置是主要的)。

C++库也基于先例 - 但是一组不同的先例,我认为可以争论的是,在STL被采用为标准之前,它并没有像C库中的函数那样广泛使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接