Tidak, tidak ada cara portabel untuk melakukan itu. Selain itu, tidak ada cara portabel untuk menggunakan #pragma sama sekali. Karenanya, banyak compiler C / C ++ yang menentukan metodenya sendiri untuk melakukan hal-hal yang mirip pragma, dan mereka sering kali dapat disematkan di makro, tetapi Anda memerlukan definisi makro yang berbeda pada setiap kompiler. Jika Anda bersedia menempuh jalur itu, Anda sering kali akhirnya melakukan hal-hal seperti ini:
#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;
Jika tidak jelas Anda ingin mendefinisikan Weak_b
dan Weak_e
sebagai konstruksi bracketing begin-and-end karena beberapa kompiler seperti GCC menambahkan atribut sebagai tambahan untuk tanda tangan tipe, dan beberapa, seperti MSC menambahkannya sebagai awalan (atau setidaknya melakukannya sekali, sudah bertahun-tahun sejak saya menggunakan MSC). Memiliki bracketing contruct memungkinkan Anda untuk menentukan sesuatu yang selalu berfungsi, bahkan jika Anda harus meneruskan seluruh tanda tangan tipe ke dalam konstruksi kompilator.
Tentu saja, jika Anda mencoba mem-porting ini ke kompiler tanpa atribut yang Anda inginkan, tidak ada yang dapat Anda lakukan selain membiarkan makro meluas dan berharap kode Anda tetap berjalan. Jika hanya memperingatkan atau mengoptimalkan pragma, ini mungkin terjadi. Dalam kasus lain, tidak terlalu banyak.
Oh, dan saya curiga Anda benar-benar perlu mendefinisikan Weak_b dan Weak_e sebagai makro yang mengambil parameter, tetapi saya tidak bersedia membaca dokumen tentang cara membuat definisi yang lemah hanya untuk contoh ini. Saya tinggalkan itu sebagai latihan untuk pembaca.