Сегодня я наткнулся на довольно интересную ошибку компилятора:
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
?