In una macro come '#define MAX(a, b) ((a) > (b) ? (a) : (b))', passare un argomento con incremento 'MAX(x++, y)' provoca l'incremento doppio di 'x' se la condizione risulta vera, generando risultati incoerenti.
MACRO_DOUBLE_EVAL
→
Il preprocessore raggiunge la fine del file sorgente mentre un blocco condizionale (#if, #ifdef, #ifndef) è ancora aperto, a causa di una direttiva '#endif' dimenticata.
UNTERMINATED_IFDEF
→
Inserire testo o commenti senza il prefisso '/*' o '//' dopo un '#endif' (es. '#endif MY_MACRO' anziché '#endif /* MY_MACRO */') viola la grammatica standard del preprocessore C.
PREPROC_EXTRA_TOKENS
→
Una macro espansa in più istruzioni ('#define FOO() a(); b();') utilizzata all'interno di un 'if (cond) FOO(); else ...' viene troncata dopo la prima istruzione, lasciando la seconda fuori dall'if e rendendo l'else sintatticamente orfano.
MACRO_EMPTY_BODY_IF
→
L'invocazione di una macro parametrizzata riceve un numero di parametri diverso da quello stabilito nella sua dichiarazione '#define MACRO(a, b)'..
MACRO_WRONG_ARGS_COUNT
→
Lo standard ISO C impedisce l'espansione ricorsiva infinita: se una macro contiene il proprio stesso nome nella sostituzione, il token autoreferenziato viene disattivato e lasciato letterale nel codice sorgente.
RECURSIVE_MACRO_EXPANSION
→
L'operatore di concatenazione '##' nelle macro produce un errore quando i due token uniti non formano un token C lessicalmente valido (es. un identificatore valido o un operatore composito).
TOKEN_PASTING_ERROR
→
Una costante o macro '#define' viene definita una seconda volta con un valore o parametri differenti nello stesso file senza essere stata preventivamente annullata con '#undef'.
MACRO_REDEFINITION
→