Hôm nay tôi stumbled khi một lỗi biên dịch khá thú vị:Lý do có số nhận dạng không được đặt trước như macro tích hợp trong gcc là gì?
int main() {
int const unix = 0; // error-line
return unix;
}
Cung cấp thông báo sau với gcc 4.3.2 (có, cổ ...):
error: expected unqualified-id before numeric constant
mà chắc chắn là khá khó hiểu.
May mắn thay, kêu vang (3.0) là hữu ích hơn một chút (như thường lệ):
error: expected unqualified-id
int const unix = 0
^
<built-in>:127:14: note: expanded from:
#define unix 1
^
Tôi chắc chắn không mong đợi unix
, mà không phải được viết bằng chữ hoa hay bắt đầu với dấu gạch dưới là một vĩ mô , đặc biệt là tích hợp sẵn.
Tôi đã kiểm tra các macro được xác định trước trong gcc và có 2 (trên nền tảng của tôi) mà sử dụng "ưa thổ lộ" biểu tượng:
$ g++ -E -dM - < /dev/null | grep -v _
#define unix 1
#define linux 1
Tất cả những người khác đang "well-behaved" macro với dấu gạch hàng đầu, sử dụng định danh truyền thống dành riêng, mẫu:
#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
(đó là một mớ hỗn độn và có dường như không có bất kỳ thứ tự cụ thể ...)
Bên cạnh đó, có rất nhiều "tương tự" biểu tượng, vì vậy tôi đoán có vấn đề về tính tương thích ngược ...
Vì vậy, các macro unix
và linux
đến từ đâu?
Hoạt động tốt trong gcc 4.7, có vẻ như một số lỗi :) –
@ Mr.Anubis: Ah tốt, tôi đang sử dụng gcc 4.3.2 (tại nơi làm việc). –
Tôi đã thêm thẻ lịch sử, tôi tin rằng đó là lịch sử ít nhất. – Xeo