Cảnh báo: Đây là một câu hỏi lạ.Mở rộng macro có điều kiện
Tôi có một số macro thực sự hữu ích mà tôi thích sử dụng để đơn giản hóa việc ghi nhật ký. Ví dụ: tôi có thể thực hiện Log(@"My message with arguments: %@, %@, %@", @"arg1", @"arg2", @"arg3")
và điều đó sẽ được mở rộng thành lời gọi phương thức phức tạp hơn bao gồm những thứ như self
, _cmd
, __FILE__
, __LINE__
, v.v ... để tôi có thể dễ dàng theo dõi mọi thứ đang được ghi nhật ký. Điều này làm việc tuyệt vời.
Bây giờ tôi muốn mở rộng các macro của mình để không chỉ hoạt động với các phương pháp Objective-C mà còn là các hàm C chung. Vấn đề là các phần self
và _cmd
nằm trong phần mở rộng macro. Hai tham số này không tồn tại trong các hàm C. Lý tưởng nhất, tôi muốn có thể sử dụng cùng một bộ macro trong các hàm C, nhưng tôi đang gặp sự cố. Khi tôi sử dụng (ví dụ) của tôi vĩ mô Log()
, tôi nhận được cảnh báo trình biên dịch về self
và _cmd
không khai báo (mà làm cho ý nghĩa tổng thể).
Suy nghĩ đầu tiên của tôi là phải làm một cái gì đó như sau (trong vĩ mô của tôi):
if (thisFunctionIsACFunction) {
DoLogging(nil, nil, format, ##__VA_ARGS__);
} else {
DoLogging(self, _cmd, format, ##__VA_ARGS__);
}
này vẫn tạo ra cảnh báo trình biên dịch, vì toàn bộ if() tuyên bố được thay thế ở vị trí của vĩ mô, dẫn đến lỗi với các từ khóa self
và _cmd
(mặc dù chúng sẽ không bao giờ được thực hiện trong khi thực hiện hàm).
suy nghĩ tiếp theo của tôi là để làm một cái gì đó như thế này (ở vĩ mô của tôi):
if (thisFunctionIsACFunction) {
#define SELF nil
#define CMD nil
} else {
#define SELF self
#define CMD _cmd
}
DoLogging(SELF, CMD, format, ##__VA_ARGS__);
Điều đó không làm việc, không may. Tôi nhận được "lỗi: '#' không được theo sau bởi tham số macro" trên #define
đầu tiên của tôi.
Suy nghĩ khác của tôi là tạo bộ macro thứ hai, đặc biệt để sử dụng trong các hàm C. Reeks này của một mùi mã xấu, và tôi thực sự không muốn làm điều này.
Có cách nào tôi có thể sử dụng cùng một tập hợp macro từ bên trong cả hai phương thức Objective-C và C và chỉ tham chiếu self
và _cmd
nếu macro nằm trong phương pháp C-mục tiêu?
chỉnh sửa biết thêm thông tin:
thisFunctionIsACFunction
được xác định một cách khá thô sơ (và tôi chắc chắn mở để cải tiến và đề nghị). Về cơ bản, điều này là:
BOOL thisFunctionIsACFunction == (__PRETTY_FUNCTION__[0] != '-' && __PRETTY_FUNCTION__[0] != '+');
Nó dựa vào hành vi của trình biên dịch để thêm một '-' hoặc '+' ví dụ và phương thức lớp vào đối tượng Objective-C. Mọi thứ khác phải là hàm C (vì hàm C không thể có tên bắt đầu bằng '-' hoặc '+').
Tôi hiểu rằng kiểm tra này về mặt kỹ thuật là kiểm tra thời gian chạy, vì __PRETTY_FUNCTION__
được thay thế bằng char*
và đây có thể là rào cản chính cho yêu cầu trợ giúp của tôi.
Làm thế nào để bạn đưa ra với 'thisFunctionIsACFunction'? – Artelius
@Artelius câu hỏi được chỉnh sửa với nhiều thông tin hơn –