Остерегайтесь нижнего подчеркивания;Стандарт С резервирует имена, начинающиеся с подчеркивания и различных других комбинаций.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 есть много других правил «зарезервированного пространства имен» - см. Связанную страницу.Это тот, который обычно игнорируется (но он периодически наносит ущерб проекту, над которым я работаю, потому что он игнорирует это правило - мне не удается установить все правила, к сожалению).