Сегодня я наткнулся на довольно интересную ошибку компилятора:
int main() {
int const unix = 0; // error-line
return unix;
}
Дает следующее сообщение с gcc 4.3.2 (да, древний ...):
error: expected unqualified-id before numeric constant
, которыйэто определенно сбивает с толку.
К счастью, clang (3.0) немного более полезен (как обычно):
error: expected unqualified-id
int const unix = 0
^
<built-in>:127:14: note: expanded from:
#define unix 1
^
Я, конечно, не ожидал unix
, что не написано ни вПрописные буквы и начинающиеся с подчеркивания не являются макросами, особенно встроенными.
Я проверил предопределенные макросы в gcc, и есть 2 (на моей платформе), которые используют «незарезервированные» символы:
$ g++ -E -dM - < /dev/null | grep -v _
#define unix 1
#define linux 1
Все остальные макросы «хорошо себя ведут» с ведущими символами подчеркивания, с использованием традиционных зарезервированных идентификаторов, пример:
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define __unix__ 1
#define __unix 1
#define __CHAR_BIT__ 8
#define __x86_64 1
#define __amd64 1
#define _LP64 1
(это беспорядок, и, похоже, нет никакихконкретный порядок ...)
Кроме того, существует множество "похожих" символов, поэтому я предполагаю, что существует проблема обратной совместимости ...
Итак, при чем здесь unix
а linux
макросы взялись?