Không, không có cách nào di động để làm điều đó. Xin nhắc lại, không có cách di động nào để sử dụng #pragma cả. Do đó, nhiều trình biên dịch C / C ++ xác định các phương thức của riêng họ để thực hiện những thứ giống như pragma và chúng thường có thể được nhúng vào macro, nhưng bạn cần một định nghĩa macro khác trên mọi trình biên dịch. Nếu bạn sẵn sàng đi theo con đường đó, bạn thường sẽ làm những việc như sau:
#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif
#define DEFINE_DELETE_OBJECT(type) \
Weak_b void delete_ ## type_(int handle) Weak_e; \
Weak_b void delete_ ## type(int handle) Weak_e;
Trong trường hợp nó không rõ ràng, bạn muốn xác định Weak_b
và Weak_e
dưới dạng cấu trúc dấu ngoặc bắt đầu và kết thúc bởi vì một số trình biên dịch như GCC thêm các thuộc tính dưới dạng phụ lục cho chữ ký kiểu và một số, như MSC thêm nó dưới dạng tiền tố (hoặc ít nhất là nó đã làm một lần, đã nhiều năm kể từ khi tôi sử dụng MSC). Có cấu trúc giằng cho phép bạn xác định một thứ gì đó luôn hoạt động, ngay cả khi bạn phải chuyển toàn bộ chữ ký kiểu vào một cấu trúc trình biên dịch.
Tất nhiên, nếu bạn thử chuyển nó sang một trình biên dịch mà không có các thuộc tính bạn muốn, bạn không thể làm gì ngoài việc để các macro mở rộng thành không có gì và hy vọng mã của bạn vẫn chạy. Trong trường hợp hoàn toàn là cảnh báo hoặc tối ưu hóa pragmas, điều này có thể xảy ra. Trong các trường hợp khác, không quá nhiều.
Ồ, và tôi nghi ngờ rằng bạn thực sự cần định nghĩa Weak_b và Weak_e là các macro nhận tham số, nhưng tôi không sẵn sàng đọc qua các tài liệu để biết cách tạo định nghĩa yếu chỉ cho ví dụ này. Tôi để đó như một bài tập cho người đọc.