¿Hay alguna forma de incrustar la declaración pragma en macro con otras declaraciones?
Estoy tratando de lograr algo como:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Estoy de acuerdo con las soluciones de refuerzo (excepto para la ola) si existe.
c-preprocessor
pragma
stringification
Anycorn
fuente
fuente
Respuestas:
Si está usando c99 o c ++ 0x, existe el operador pragma, usado como
que es equivalente a
excepto que se puede usar en macros (ver sección 6.10.9 del estándar c99, o 16.9 del borrador final del comité c ++ 0x)
Por ejemplo,
cuando se pone en
gcc -E
dafuente
__pragma()
operador de preprocesador, que desafortunadamente es ligeramente diferente del_Pragma()
operador de C99 (C99 toma un literal de cadena, MSVC toma tokens que no están en una cadena): msdn.microsoft.com/en-us/library/d9x1s805 .aspxUna cosa buena que puede hacer con _Pragma ("argumento") es usarlo para solucionar algunos problemas del compilador, como
fuente
No, no existe una forma portátil de hacerlo. Por otra parte, no hay formas portátiles de usar #pragma en absoluto. Debido a esto, muchos compiladores de C / C ++ definen sus propios métodos para hacer cosas similares a pragma y, a menudo, se pueden incrustar en macros, pero necesita una definición de macro diferente en cada compilador. Si está dispuesto a seguir ese camino, a menudo termina haciendo cosas como esta:
En caso de que no sea obvio, desea definir
Weak_b
yWeak_e
como construcciones entre corchetes de principio y fin porque algunos compiladores como GCC agregan los atributos como un apéndice a una firma de tipo, y algunos, como MSC, lo agregan como prefijo (o al menos lo hizo una vez, han pasado años desde que utilicé MSC). Tener construcciones entre corchetes le permite definir algo que siempre funciona, incluso si tiene que pasar la firma de tipo completa a una construcción del compilador.Por supuesto, si intenta portar esto a un compilador sin los atributos que desea, no puede hacer nada más que dejar que las macros se expandan a cero y esperar que su código aún se ejecute. En caso de pura advertencia u optimización de pragmas, esto es probable. En otros casos, no tanto.
Ah, y sospecho que en realidad necesitaría definir Weak_b y Weak_e como macros que toman parámetros, pero no estaba dispuesto a leer los documentos sobre cómo crear una definición débil solo para este ejemplo. Dejo eso como un ejercicio para el lector.
fuente
No, no puede poner sentencias de preprocesador en sentencias de preprocesador. Sin embargo, podría ponerlo en una
inline
función. SinC
embargo, eso derrota a la etiqueta.fuente
inline
, y la mayoría de las principales implementaciones de C89 tienen alguna variación.inline
otra cosa que C tomó prestada de C ++!:)