C · Intermediário · Português · Técnico
efeito colateral em macro
Problema em que um argumento de macro com efeito, como i++, é expandido em vários pontos e executado mais de uma vez, produzindo resultados inesperados.
Onde usar
MAX(a++, b) pode incrementar a duas vezes. É por isso que muitos guias recomendam funções static inline para operações simples.
Em código
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int i = 5, j = 3;
int m = MAX(i++, j);
// i++ roda 2 vezes: m = 6, i = 7Exemplos
O i++ dentro do MAX é um efeito colateral em macro, ele roda duas vezes.
Troque a macro por função para evitar efeito colateral em macro.
Cuidado
Achar que parênteses resolvem: só evitar argumentos com efeito colateral ou usar funções elimina o problema.
Sinônimos
avaliação dupla