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 đỡ.
Có thể nó được dự định là toán tử '#' (stringizing) bên trong cuộc gọi hàm không? –
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