no recomendaría el uso de #warning, ya que no es estándar C. Además, ¿qué es lo que desea advertir contra pero no generará un error en contra? Las advertencias son típicamente algo que el compilador usa cuando estás haciendo algo que es sospechoso, nuestro peligro absoluto, pero permitido por el estándar C. No tiene ese caso en la aplicación normal, va a querer compilar sin problemas o no compilarlo. Por lo tanto, utilizaría #error estándar y no estándar # warning.
No puede escribir el contenido real de la definición del preprocesador. Algo como esto podría ser suficiente:
#if (AAA < SOMETHING) && (AAA > SOMETHING_ELSE)
#error AAA is bad.
#endif
Creo que esto es lo suficientemente detallado para el programador. Sin embargo, si realmente quiere más detalles y tiene un compilador moderno de C, puede usar static_assert.A continuación, se puede lograr algo parecido a lo que quiere:
#include <assert.h>
#define xstr(s) str(s)
#define str(s) #s
#define err_msg(x) #x " is " xstr(x)
#define AAA 17
static_assert(AAA != 17, err_msg(AAA));
este lío macro debe imprimir AAA es 17. Una explicación sobre cómo estos macros obra se encuentra here.
No estoy seguro de si está incluido static_assert en C99 o C11, ciertamente está en C11. Es posible que deba usar alguna extensión de GCC para habilitarlo.
De acuerdo con el estándar de C a partir de 1999, es suficiente con '# error' para algo así y no expande ninguna macro, solo imprime el texto literalmente y hace que la compilación se detenga. ¿Qué intentas lograr con esto de todos modos? –
Tengo una jerarquía de muchos archivos MAK que definen AAA de varias maneras, dependiendo de los parámetros del objetivo de creación. Me gustaría verificar que la definición sea correcta para el objetivo. Y no me gustaría crear una lista de #if AAA = 1 ... #warning "es 1" ... – elomage
Además, esto es para el mundo integrado sin pantallas, por lo que no puedo probar fácilmente el valor de macro agregando algo como printf (#AAA); y verifíquelo en tiempo de ejecución. – elomage