No, non esiste un modo portatile per farlo. Inoltre, non ci sono modi portatili per usare #pragma. Per questo motivo, molti compilatori C / C ++ definiscono i propri metodi per fare cose simili a pragma, e spesso possono essere incorporati nelle macro, ma è necessaria una definizione di macro diversa su ogni compilatore. Se sei disposto a seguire quella strada, spesso finisci per fare cose come questa:
#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;
Nel caso non sia ovvio che si desidera definire Weak_b
e Weak_e
come costrutti di parentesi di inizio e fine perché alcuni compilatori come GCC aggiungono gli attributi come addendum a una firma di tipo e alcuni, come MSC, lo aggiungono come prefisso (o almeno lo ha fatto una volta, sono passati anni da quando ho usato MSC). Avere i comandi di bracketing ti permette di definire qualcosa che funziona sempre, anche se devi passare l'intera firma del tipo in un costrutto del compilatore.
Ovviamente, se provi a portarlo su un compilatore senza gli attributi che desideri, non puoi fare altro che lasciare che le macro si espandano e sperare che il tuo codice funzioni ancora. In caso di pragmi puramente di avvertimento o ottimizzazione, questo è probabile. In altri casi, non così tanto.
Oh, e sospetto che avresti effettivamente bisogno di definire Weak_b e Weak_e come macro che accettano parametri, ma non ero disposto a leggere i documenti su come creare una definizione debole solo per questo esempio. Lo lascio come esercizio per il lettore.