Hayır, bunu yapmanın taşınabilir bir yolu yok. Yine de, #pragma'yı kullanmanın taşınabilir bir yolu yoktur. Bu nedenle, birçok C / C ++ derleyicisi pragma benzeri şeyler yapmak için kendi yöntemlerini tanımlar ve bunlar genellikle makrolara gömülebilir, ancak her derleyicide farklı bir makro tanımına ihtiyacınız vardır. Bu rotaya gitmeye istekliysen, genellikle şöyle şeyler yaparsın:
#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;
Durumunda onun değil bariz Tanımlamak istediğiniz Weak_b
ve Weak_e
GCC gibi bazı derleyiciler bir tür imza zeyilname gibi nitelikleri ekleyin ve bazı MSC gibi bir önek olarak ekleyin çünkü olarak (veya en azından yaptım yapıları paranteze-ve-sonu başlayacak MSC'yi kullandığımdan beri yıllar geçti). Parantez oluşturma yapılarına sahip olmak, tüm tip imzasını bir derleyici yapısına geçirmeniz gerekse bile her zaman çalışan bir şeyi tanımlamanıza olanak tanır.
Elbette, bunu istediğiniz öznitelikler olmadan bir derleyiciye taşımayı denerseniz, makroları hiçbir şeye genişletmeden ve kodunuzun hala çalışacağını ummaktan başka yapabileceğiniz hiçbir şey yoktur. Tamamen uyarı veya pragmaları optimize etme durumunda, bu muhtemeldir. Diğer durumlarda, o kadar değil.
Oh, ve Weak_b ve Weak_e'yi parametreleri alan makrolar olarak tanımlamanız gerektiğinden şüpheleniyorum, ancak sadece bu örnek için nasıl zayıf bir tanım oluşturacağımı öğrenmek için dokümanları okumaya istekli değildim. Bunu okuyucu için bir alıştırma olarak bırakıyorum.