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

我意识到这可能是一个偏好问题,但我注意到我见过的很多代码示例中的变量名称都有g_s_m__的前缀。 这是一种普遍接受的做法,这些前缀是什么意思? 还有其他人会很高兴知道吗?

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

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

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

  • _也可以用来表示一个局部变量(这个实际上不是“标准”)
  • k可用于表示常数

谨防领先的下划线; 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 _t ‘”。 这意味着如果在POSIX环境中包含任何POSIX标头 – 记住是POSIX标头以及标准C标头 – 那么你不应该有任何以_t结尾的typedef,例如:

C:

 typedef struct data_t { ... } data_t; // Usurping POSIX namespace 

C ++:

 struct data_t { ... }; // Usurping POSIX namespace 

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

人们有时会使用“g_”,它们实际上意味着“f_”,即文件范围变量。

除了一个单独的下划线前缀(例如_foo ),这只是非常丑陋的风格。 使用单独的下划线通常会导致未定义的行为。

我个人认为这种做法完全没有必要,并且在某些方面令人憎恶。 如果您使用的是体面的IDE,则不需要任何此类IDE。