Для конкретного примера отличия компилятора C ++ от компилятора C разумным выбором является макрос __cplusplus
, который определен стандартом C ++ и существует из-за побочных эффектов правил зарезервированных имен предложение, которое говорит об этом в стандартном C, никогда не будет предопределено компилятором C.
Каждый компилятор имеет набор предопределенных макросов, которые иногда полезны для различения хостов компиляции и целевых платформ.Одним из больших репозиториев таких макросов является Predef Project , где они собирают отчеты о максимально возможном количестве комбинаций компилятора, хоста и цели.
Редактировать: Разъяснение зарезервированной природы __cplusplus
в C: Стандарт C всегда имеет зарезервированные идентификаторы, которые начинаются с двух подчеркиваний или одного подчеркивания, за которыми следует заглавная буква.Например, C99 в разделе 7.1.3 гласит:
«Все идентификаторы, которые начинаются со знака подчеркивания и либо с заглавной буквы, либо другого знака подчеркивания, всегда зарезервированы для любого использования.»,
и несколько других пунктов содержат сноску, которая читается частично
«Ключевые слова, определяемые реализацией, должны иметь форму идентификатора, зарезервированного для любого использования, как описано в 7.1.3.»
Итак, без каких-либо дополнительных указаний от стандарта в совместимой реализации компилятора C имя __cplusplus
зарезервировано для любого использования.Это имя было выбрано разработчиками C ++ именно потому, что оно было зарезервировано в C, имеет четкое значение и не было известно, что оно было определено какой-либо реализацией C.
Однако C99 комитет по стандартам решил удостовериться, что ни одна реализация C не повредила очевидную полезность макроса, который можно использовать для отличия компиляции C от компиляции C ++.В разделе C.10 раздела 6.10.8 написано:
«Реализация не должна предопределять макрос _ _cplusplus и не должна определять его в каком-либо стандартном заголовке.»
Еготрудно понять более ясно, чем это.