Không, không có cách nào để thực hiện điều đó. Sau đó, một lần nữa, không có cách nào để sử dụng #pragma. Bởi vì điều này, nhiều trình biên dịch C/C++ định nghĩa các phương thức riêng của chúng để thực hiện những thứ giống như pragma, và chúng thường có thể được nhúng trong các macro, nhưng bạn cần một định nghĩa macro khác nhau trên mọi trình biên dịch. Nếu bạn sẵn sàng để đi con đường đó, bạn thường kết thúc làm công cụ như thế này:
#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 của nó không rõ ràng bạn muốn xác định Weak_b
và Weak_e
như cấu trúc bracketing 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 như là một phụ lục cho một chữ ký loại, và một số, như MSC thêm nó như là một tiền tố (hoặc ít nhất nó đã làm một lần, năm của nó kể từ khi tôi đã sử dụng MSC). Việc có các kết nối khung cho phép bạn định nghĩa một cái gì đó luôn 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 sang trình biên dịch mà không 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 cảnh báo hoặc tối ưu hóa pragmas, điều này có khả năng. Trong các trường hợp khác, không quá nhiều. Ồ, và tôi nghi ngờ bạn thực sự cần phải định nghĩa Weak_b và Weak_e làm macro tham số, nhưng tôi không sẵn sàng đọc qua tài liệu về cách tạo định nghĩa yếu cho ví dụ này. Tôi để nó như một bài tập cho người đọc.
Có thể cho rằng nó không phải là - #pragmas không được xác định theo tiêu chuẩn C hoặc C++. –
Bộ tiền xử lý là, ngay cả khi tiểu ban được phép cụ thể mà anh ta muốn chạy không phải là. – Puppy
@DeadMG: Có rất nhiều điều rất phổ biến giữa C và C++. Trong khi tiền xử lý là _mostly_ phổ biến, có sự khác biệt lớn trong cách tiền xử lý được chỉ định tùy thuộc vào tiêu chuẩn ngôn ngữ nào đang được sử dụng (C89, C99, C++ và C++ 0x FCD). –