No, non esiste un modo portatile per farlo. Poi di nuovo, non ci sono modi portatili per usare #pragma. Per questo motivo, molti compilatori C/C++ definiscono i propri metodi per fare cose pragma-like, e spesso possono essere incorporati in macro, ma è necessaria una diversa definizione di macro su ogni compilatore. Se siete disposti a seguire questa strada, spesso si finisce 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 in cui il suo non è ovvio che si desidera definire Weak_b
e Weak_e
come costrutti bracketing inizio-e-end perché alcuni compilatori come GCC aggiungi gli attributi come appendice a una firma di tipo e alcuni, come MSC, aggiungono come prefisso (o almeno lo ha fatto una volta, sono passati anni da quando ho usato MSC). Avere contrasti di bracketing consente di definire qualcosa che funziona sempre, anche se si deve passare l'intera firma di tipo in un costrutto del compilatore.
Ovviamente, se si prova a eseguire il porting su un compilatore senza gli attributi desiderati, non c'è nulla che si possa fare, ma lasciare le macro espandersi su nulla e sperare che il codice funzioni ancora. In caso di pragmi puramente di avvertimento o di ottimizzazione, è probabile. In altri casi, non così tanto.
Oh, e sospetto che sia effettivamente necessario definire Weak_b e Weak_e come macro che accettano parametri, ma non ero disposto a leggere i documenti per come creare una definizione debole solo per questo esempio. Lo lascio come esercizio per il lettore.
Probabilmente non è né - #pragmas non sono definiti dagli standard C o C++. –
Il preprocessore è, anche se lo specifico sottocomando consentito che vuole eseguire non lo è. – Puppy
@DeadMG: Esistono molte cose comuni tra C e C++. Sebbene la pre-elaborazione sia prevalentemente comune, ci sono grandi differenze nel modo in cui viene specificata la pre-elaborazione, a seconda dello standard di linguaggio utilizzato (C89, C99, C++ e FCD C++ 0x). –