通常接受的变量名称格式 - C/C++

Jim*_*ell 4 c c++ variables

我意识到,这可能是偏好的问题,但我注意到,在很多代码样本中我见过的变量名称具有前缀g_,s_,m_,或只_.这是一种普遍接受的做法,这些前缀是什么意思?还有其他人会很高兴知道吗?

Jon*_*Jon 9

  • g_ 是一个全局变量
  • s_ 是一个静态的
  • m_ 是一个成员(一个实例变量)
  • _ 是成员,还是更具体的私人成员(两个用户都出现了)

这很常见,许多开发人员都知道它,虽然它(据我所知)并不是普遍接受的.我不认为你错过任何其他人.

更新:集成以下评论以提高可见性

  • _ 也可以用来表示局部变量(这个真的不是"标准")
  • k 可用于表示常量


Jon*_*ler 8

谨防领先的下划线; C标准保留以下划线和各种其他组合开头的名称.ISO/IEC 9899:1999(又名C99标准)说:

§7.1.3保留标识符

每个标头声明或定义其关联子条款中列出的所有标识符,并可选地声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符.

- 所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途.

- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符.

- 如果包含任何相关标头,则保留以下任何子条款中的每个宏名称(包括未来的库方向)以供指定使用; 除非另有明确说明(见7.1.4).

- 以下任何子条款中包含外部链接的所有标识符(包括未来的库方向)始终保留用作具有外部链接的标识符.154)

- 如果包含任何相关标头,则保留下列任何子条款(包括未来库方向)中列出的具有文件范围的每个标识符,以用作宏名称和具有相同名称空间的文件范围的标识符.

没有保留其他标识符.如果程序在保留它的上下文中声明或定义标识符(除了7.1.4允许的标识符),或者将保留标识符定义为宏名称,则行为是未定义的.

154)具有外部链接的保留标识符列表包括errno,math_errhandling,setjmp和va_end.

规则很复杂,以至于更简单:

  • 不要使用下划线启动标识符

POSIX预留标识符约定

还要注意使用' _t'后缀来表示类型名称,尤其是在POSIX环境中.实际上,链接页面上的规则比C99标准中的规则更广泛,但是一行代表" ANY HEADER suffix" _t'.这意味着如果你在POSIX环境中包含任何POSIX标题 - 记住它<stdio.h>是一个POSIX标题以及一个标准的C标题 - 那么你不应该有任何以下结尾的typedef _t:

C:

typedef struct data_t { ... } data_t;  // Usurping POSIX namespace
Run Code Online (Sandbox Code Playgroud)

C++:

struct data_t { ... };  // Usurping POSIX namespace
Run Code Online (Sandbox Code Playgroud)

POSIX中还有许多其他"保留名称空间"规则 - 请参阅链接页面.这是一个常被蔑视的(但它会定期伤害我工作的项目,因为它忽略了这个规则 - 我不能设置所有规则,遗憾的是).

  • `_t`由POSIX保留,不应在用户代码中使用,但很多人忽略了这一点. (2认同)