2013-10-30 16 views
7

Tôi gặp lỗi trình biên dịch với GCC khi cố gắng xử lý một số macro từ một số mã TI biên dịch ok với trình biên dịch TI.Tôi đang thiếu gì với toán tử ##

của Macro trong câu hỏi là một số biến thể của

#define CHIP_FSET(Reg,Field,Val)  _CHIP_##Reg##_FSET(##Field,Val) 

và nó được sử dụng trong mã như

CHIP_FSET(ST1_55, XF, CHIP_ST1_55_XF_OFF) 

và khi GCC được một tổ chức của nó nói

error: pasting "(" and "XF" does not give a valid pre-processing token

Nó xử lý trước thành công nếu tôi xóa ## ở phía trước Field. Nếu tôi hiểu mã chính xác thì ## ở phía trước trường có vẻ không thích hợp vì nó được chuyển thành một cuộc gọi hàm (hoặc một cuộc gọi macro khác) có hai tham số. Vì vậy, ## là dự phòng, thay thế ban đầu sẽ dẫn đến ..._ FSET (Field, Val) anyway.

Vì vậy, tôi đang thiếu gì? Tất cả mọi thứ tôi có thể tìm thấy trên chỉ thị xử lý trướC## cho biết nó chỉ dính văn bản lại với nhau. Vì vậy, cáC## không bao giờ làm bất cứ điều gì ở nơi đầu tiên trong trường hợp này.

Tôi đang thiếu gì?

Và tại sao GCC sẽ tắt tiếng nhưng trình biên dịch TI cho phép? Tôi đoán câu trả lời cho rằng đó là một cái gì đó như "phần mơ hồ của spec".

=========================

Cập nhật

Tôi nghĩ vấn đề là bởi vì có một loạt các lồng nhau các macro có thể không được giải quyết hoàn toàn. Những gì trình biên dịch kết thúc với là không hợp lệ để nó spits giả tại một số điểm trong chế biến tất cả.

Tôi đã cố gắng giải quyết vấn đề tồi tệ hơn bằng cách điền vào các macro bị thiếu và nó đã khiến một số phần khác bị hỏng. Đó là niềm vui của việc chuyển mã giữa các nền tảng và trình biên dịch mà tôi đoán.

Cảm ơn sự giúp đỡ.

+3

Có thể nó được dự định là toán tử '#' (stringizing) bên trong cuộc gọi hàm không? –

+0

Tôi không chắc chắn. Điều đó sẽ không giải thích tại sao nó hoạt động trên trình biên dịch TI. – user2939408

Trả lời

4

Không có thông số kỹ thuật nào không rõ ràng. ## hoạt động trên cấp độ mã thông báo. Nó được yêu cầu rằng hai thẻ được dán với nhau phải tạo thành một mã thông báo hợp lệ, một lần nữa. ( không tạo thành mã thông báo có ký tự alpha, do đó là thông báo lỗi.

+0

Cảm ơn. Vậy tại sao trình biên dịch cũ lại chấp nhận nó? Điều gì gây nhầm lẫn là, tại sao nó được thực hiện ngay từ đầu? Sẽ ## làm nhiều hơn là chỉ dán chúng lại với nhau? – user2939408

+3

Trình biên dịch cũ hơn chấp nhận nó là cẩu thả - hay còn gọi là lỗi. –

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