2009-07-05 72 views
15

Tôi đang cố gắng xây dựng Amaya. Khi bản dựng không thành công vớiGỡ lỗi bộ tiền xử lý C++

error: expected unqualified-id before ‘(’ token

Tôi chạy g ++ chỉ với bộ tiền xử lý (thay thế tùy chọn -c bằng -E) trên tệp không biên dịch để xem điều gì đang diễn ra. Điều này tạo ra một tập tin 80.000 dòng, cho tôi thấy rằng 'Xanh' đã được thay thế bằng (2 < < 8), trong đó giải thích rõ ràng lỗi. Nếu tôi sửa lỗi này, tệp sẽ biên dịch tốt. Tôi đoán tôi có thể sống với điều đó, nhưng tôi muốn tìm hiểu lý do tại sao điều này xảy ra.

Có cách nào tôi có thể theo dõi cách bộ xử lý trước thay thế một chuỗi cụ thể, trong trường hợp này là 'Xanh'?

================= Cập nhật ===================

Vâng, tôi đã tìm thấy thủ phạm:

> headers=`g++ [omited for brevity] -M \ 
    ../../thotlib/dialogue/AmayaClassicNotebook.cpp` 

> for file in $headers ; do grep -s -H Blue $file | grep "(2 << 8)";done 

/usr/local/include/gc.h:#define Blue (2 << 8) 

Vì vậy, thêm #undef Màu xanh đã khắc phục được sự cố. Vì vậy, sử dụng sự kết hợp này của -M và grep có vẻ OK nhưng đôi khi định nghĩa tiền xử lý C++ có thể là một khu rừng thực sự; Tôi đã tò mò liệu có một số cách tốt hơn, một số công cụ GNU thông minh có thể.

+0

Nền tảng nào? – laalto

+0

i686 GNU/Linux. – Alex

Trả lời

3

Nếu không có bất kỳ điều gì tốt hơn (dựa trên thông tin dòng nguồn trong tệp đã được xử lý), bạn có thể sử dụng tùy chọn -M để nhận danh sách các tiêu đề được bao gồm trong tệp nguồn và tìm kiếm các tiêu đề cho "Blue" . Tôi hy vọng nó có thể cho một số loại obfuscation có nghĩa là điều này không tìm thấy những gì bạn đang tìm kiếm, nhưng thông thường bạn sẽ bật lên định nghĩa một nơi nào đó.

+0

Điều này phải được bao gồm bởi -E –

1

Có gì sai với sự lâu năm

find /src -exec grep Blue {} /dev/null ';' 

Đó thường làm việc cho tôi, ít nhất là một vết cắt đầu tiên.

+0

Một nơi khác để grep là tiêu đề hệ thống như/usr/include. – laalto

+1

Trong trường hợp này, #define nằm ở vị trí hệ thống, không phải trong tệp dưới thư mục nguồn – Alex

10

tôi thấy chạy

g++ ... -dD -E $file > $file.ii 

là rất hữu ích trong việc bóc tách vấn đề tiền xử lý. Từ man g++:

-dD Dump all macro definitions, at the end of preprocessing, 
    in addition to normal output. 
+0

Dường như không phải -dD cũng như -E xuất ra bất kỳ thứ gì nếu phát hiện lỗi cú pháp trong quá trình tiền xử lý. . –

Các vấn đề liên quan