В чем причина наличия незарезервированных идентификаторов в качестве встроенных макросов в gcc?

Сегодня я наткнулся на довольно интересную ошибку компилятора:

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 ?

25
задан porges 13 January 2012 в 03:18
поделиться