Сегодня я наткнулся на довольно интересную ошибку компилятора:
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
Все остальные являются "хорошо выполненными" макросами с ведущими символами подчеркивания, используя традиционные зарезервированные идентификаторы, sample:
#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
?