Definire macro con argomenti senza racchiudere i parametri e l'intera espressione tra parentesi (es. '#define SQUARE(x) x * x' anziché '((x)*(x))') produce calcoli errati quando viene passata un'espressione come 'SQUARE(2 + 3)'.
MACRO_PRECEDENCE_BUG
→
L'espressione costante valutata in una direttiva condizionale '#if (MY_CONST / 0)' contiene un'operazione di divisione per zero aritmetica, bloccando la fase di preprocessing.
PREPROC_DIV_ZERO
→
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
→