Ответ 1
Does underscore convention matter?
Да. Это важно.
Идентификаторы с ведущим подчеркиванием, за которым следует буква верхнего регистра, зарезервированы для реализации. Итак, у вас есть поведение undefined.
Ниже приведена стандартная спецификация C для обозначения идентификаторов (проект C11):
7.1.3 Зарезервированные идентификаторы
Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в его связанный подзаголовок и, возможно, объявляет или определяет идентификаторы перечисленные в соответствующем подпункте идентификаторы, которые всегда зарезервированы либо для любого использования, либо для использования в качестве идентификаторы области файла.
- Все идентификаторы, начинающиеся с символа подчеркивания, и прописная буква или другое подчеркивание всегда зарезервированы для любого использовать.
- Все идентификаторы, начинающиеся с символа подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с объемом файла как в обычном, так и в теге пространства имен.
- Каждое имя макроса в любом из следующих подпунктов (включая будущие направления библиотек) зарезервировано для использования, как указано, если какой-либо из связанные с ним заголовки; если явно не указано иное (см. 7.1.4). - Все идентификаторы с внешней связью в любом из следующих подпунктах (включая будущие направления библиотек) и errno всегда зарезервированы для использования в качестве идентификаторов с внешними linkage.184) - Каждый идентификатор с областью файлов, указанный в любом из следующие подпункты (включая будущие направления библиотек) зарезервировано для использования в качестве имени макроса и как идентификатор с областью файлов в том же имени, если включен какой-либо из связанных заголовков.
Никакие другие идентификаторы не зарезервированы. Если программа заявляет или определяет идентификатор в контексте, в котором он зарезервирован (кроме как разрешено в соответствии с 7.1.4) или определяет зарезервированный идентификатор в качестве имени макроса, поведение undefined.
Если программа удаляет (с помощью #undef) любое определение макроса идентификатор в первой группе, указанной выше, поведение undefined.
Без нарушения какого-либо из вышеизложенного, имя защищающего включить может быть чем угодно и не должно быть именем файла заголовка. Но обычно соглашение, которое я видел/использовал, - это использовать то же имя, что и имя заголовка, чтобы оно не вызывало ненужной путаницы.