non mi consiglia di utilizzare #WARNING, dal momento che non è standard C. Inoltre, ciò che è lì che si desidera mettere in guardia contro, ma non genera un errore contro? Gli avvertimenti sono in genere qualcosa che il compilatore utilizza quando stai facendo qualcosa di sospetto che è assolutamente pericoloso, ma consentito dallo standard C. Non hai questo caso nella normale applicazione, lo vuoi compilare in modo impeccabile o non farlo affatto. Quindi userò #error standard e non #warning non standard.
Non è possibile digitare il contenuto effettivo della definizione pre-processore. Qualcosa di simile potrebbe essere sufficiente:
#if (AAA < SOMETHING) && (AAA > SOMETHING_ELSE)
#error AAA is bad.
#endif
Penso che questo sia abbastanza dettagliato per il programmatore. Tuttavia, se si davvero vuole maggiori dettagli e si dispone di un moderno compilatore C, è possibile utilizzare static_assert.Poi si può ottenere qualcosa di simile a ciò che si vuole:
#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));
questa macro pasticcio dovrebbe stampare AAA è 17. Una spiegazione su come queste macro lavoro può essere trovato here.
Non sono sicuro se static_assert fosse incluso in C99 o C11, è sicuramente in C11. Potrebbe essere necessario utilizzare qualche estensione GCC per abilitarlo.
Secondo lo standard C a partire dal 1999, si hanno solo '# error' per qualcosa di simile e non espande nessuna macro, stampa semplicemente il testo letteralmente e causa la chiusura della compilazione. Cosa stai cercando di ottenere con questo comunque? –
Ho una gerarchia di molti makefile che definiscono AAA in vari modi, a seconda dei parametri del make target. Vorrei verificare che la definizione sia corretta per il target. E non vorrei creare un elenco di #if AAA = 1 ... #warning "è 1" ... – elomage
Inoltre, questo è per il mondo embedded senza display, quindi non posso facilmente testare il valore della macro di aggiungendo qualcosa come printf (#AAA); e controllarlo in fase di esecuzione. – elomage