No, no hay una forma portátil de hacerlo. Por otra parte, no hay formas portátiles de usar #pragma en absoluto. Debido a esto, muchos compiladores C/C++ definen sus propios métodos para hacer cosas parecidas a pragma, y a menudo se pueden incrustar en macros, pero se necesita una definición de macro diferente en cada compilador. Si usted está dispuesto a ir por ese camino, que a menudo terminan haciendo cosas como esta:
#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;
En caso de que no es obvio que desea definir Weak_b
y Weak_e
como construcciones de horquillado comenzar-y-finales porque algunos compiladores como GCC agregue los atributos como un apéndice a una firma de tipo, y algunos, como MSC, lo agregan como un prefijo (o al menos lo hizo una vez, han pasado años desde que utilicé MSC). Tener construcciones de horquillado le permite definir algo que siempre funciona, incluso si tiene que pasar la firma de tipo completa a una construcción de compilador.
Por supuesto, si intenta portar esto a un compilador sin los atributos que desea, no hay nada que pueda hacer sino dejar que las macros se expandan a nada y esperar que su código aún se ejecute. En caso de pragmas de advertencia pura o de optimización, es probable. En otros casos, no tanto.
Oh, y sospecho que en realidad necesitaría definir Weak_b y Weak_e como macros que toman los parámetros, pero no estaba dispuesto a leer los documentos sobre cómo crear una definición débil solo para este ejemplo. Lo dejo como un ejercicio para el lector.
Podría decirse que no es ni - #pragmas no están definidos por los estándares C o C++. –
El preprocesador es, incluso si el subcomando permitido específica quiere correr no lo es. – Puppy
@DeadMG: hay muchas cosas que son comunes entre C y C++. Mientras preprocesamiento es _mostly_ común, existen grandes diferencias en cómo se especifica procesamiento previo en función de la lengua estándar está siendo utilizado (C89, C99, C++ y C++ 0x FCD). –