Prós e contras de diferentes funções macro / métodos inline em C

De acordo com o C FAQExistem basicamente 3 métodos práticos para o código "inlining" em C:

#define MACRO(arg1, arg2) do { \
    /* declarations */ \
    stmt1;   \
    stmt2;   \
    /* ... */  \
    } while(0)    /* (no trailing ; ) */

ou

#define FUNC(arg1, arg2) (expr1, expr2, expr3)

Para esclarecer este, os argumentos são usados ​​nas expressões, e o operador vírgula retorna o valor da última expressão.

ou

usando oinline declaração que é apoiada comoextensão para gcc e no padrão c99.

odo { ... } while (0) O método é amplamente utilizado no kernel do Linux, mas eu não encontrei os outros dois métodos com muita frequência, se é que algum.

Estou me referindo especificamente a "funções" com várias instruções, e não a instruções únicas como MAX ou MIN.

Quais são os prós e contras de cada método, e por que você escolheria um sobre o outro em várias situações?

questionAnswers(3)

yourAnswerToTheQuestion