Форматирование имен общепринятых переменных - C / C ++ - PullRequest
4 голосов
/ 02 декабря 2010

Я понимаю, что это может быть вопросом предпочтения, но я заметил, что имена переменных во многих примерах кода, которые я видел, имеют префикс g_, s_, m_ или просто _. Это общепринятая практика, и что означают эти префиксы? Есть ли другие, которые было бы полезно узнать?

Ответы [ 5 ]

9 голосов
/ 02 декабря 2010
  • g_ - глобальная переменная
  • s_ - статическая
  • m_ - член (переменная экземпляра)
  • _ является либо участником, либо, точнее, частным участником (оба варианта использования встречаются)

Это достаточно часто, что многие разработчики знают об этом, хотя это (насколько мне известно) не является общепринятым.Я не думаю, что вам не хватает других.

Обновление: Интегрирование комментариев ниже для лучшей наглядности

  • _ также может использоваться для обозначениялокальная переменная (эта на самом деле не «стандартная»)
  • k может использоваться для обозначения константы
8 голосов
/ 02 декабря 2010

Остерегайтесь нижнего подчеркивания;Стандарт С резервирует имена, начинающиеся с подчеркивания и различных других комбинаций.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 - помня, что <stdio.h> является заголовком POSIX, а также стандартным заголовком C - тогда у вас не должно быть никаких typedefs, заканчивающихся _t, таких как:

C:

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

C ++:

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

В POSIX есть много других правил «зарезервированного пространства имен» - см. Связанную страницу.Это тот, который обычно игнорируется (но он периодически наносит ущерб проекту, над которым я работаю, потому что он игнорирует это правило - мне не удается установить все правила, к сожалению).

0 голосов
/ 02 декабря 2010

Я лично считаю эту практику совершенно ненужной и в некоторых отношениях отвратительной.Если вы используете приличную IDE, вам не нужно ничего этого.

0 голосов
/ 02 декабря 2010

Помимо префикса одиночного подчеркивания (например, _foo), это просто очень уродливый стиль.Использование одиночного подчеркивания обычно приводит к неопределенному поведению.

0 голосов
/ 02 декабря 2010

Люди иногда используют «g_», где они фактически означают «f_», то есть переменную области видимости файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...