ti-enxame.com

função inline vs função macro

Possível duplicado:
Funções inline versus macros de pré-processador

Eu quero saber a diferença entre a função inline e a função macro.

1) é função inline é o mesmo da função macro?

2) Eu sei que ambos não são chamados, mas eles são substituídos por seu código na fase de compilação. não é?

3) Se houver diferença, você poderia especificá-lo?

14
MOHAMED

Inline substitui uma chamada para uma função com o corpo da função, no entanto, inline é apenas um request para o compilador que pode ser ignorado (você ainda pode passar alguns sinalizadores para o compilador para forçar inline ou usar always_inline atributo com gcc).

Por outro lado, uma macro é expandida pelo preprocessor antes da compilação, então é como a substituição de texto, também as macros não são marcadas, as funções inline são. Há uma comparação no wiki

Por questões de integridade, você ainda pode ter algum tipo de segurança com macros, usando o __typeof__ do gcc, por exemplo, o seguinte código quase idêntico e ambos causam avisos se usados ​​com os tipos errados:

#define max(a,b) \
  ({ __typeof__ (a) _a = (a); \
      __typeof__ (b) _b = (b); \
    _a > _b ? _a : _b; })

__attribute__((always_inline)) int max(int a, int b) {
   return (a > b ? a : b);
}

Nota: às vezes, macros sem tipo são exatamente o que é necessário, por exemplo, dê uma olhada em como uthash usa macros para tornar qualquer estrutura C hashable sem recorrer a lançamentos.

23
iabdalkader

1) não.

2) Uma Macro em C é simplesmente um texto que é expandido antes o compilador processa o código fonte. A palavra-chave inline é usada como uma dica para o compilador de que a função pode ser colocada em linha sem a necessidade de uma pilha de chamadas a ser configurada.

Por exemplo, digamos que você tenha os dois trechos de código a seguir (primeiro a macro e depois a função inline):

#define MAX(x,y)     (x > y ? x : y)

e

inline int max(int x, int y) { return x > y ? x : y; }

Quando o pré-processador encontra a seguinte chamada em seu código:

int highest = MAX (var_1, var_2);

substitui-lo com

int highest = (var_1 > var_2 ? var_1 : var_2);

O acima é o que o compilador eventualmente obtém durante o processo de compilação, portanto, o fragmento definido por MAX (x, y) é a substituiçãopara MAX (var_1, var_2). Quando o compilador encontra a chamada de função

int highest = max (var_1, var_2);

Então a função "max" é chamada. Você deve assumir que ele é chamado de maneira normal, porque o compilador está livre para ignorar sua dica "inline" e fazer chamadas para a função passar pela pilha de chamadas normal em vez de simplesmente colocar o código para a função no lugar em que está. encontrado.

Uma última ressalva com macros: porque é tudo substituição de texto e não substituição de código, se você fizer algo assim:

int highest = MAX (v1++, v2++);

o pré-processador expandirá isso para:

int highest = (v1++ > v2++ ? v1++ : v2++);

o que provavelmente não é o que você pretendia.

18
Lelanthran

Macros são declarações que são substituídas pelo pré-processador (antes do real compile) As funções não são de todo. Antes que a fase compile atual comece, as macros desapareceram há muito tempo, e tudo o que resta são suas expansões (incluindo expansão para nada).

As funções inline são, na verdade, functions compatíveis com a linguagem, com regras de escopo, declarações de variáveis, construções lógicas (loops, etc) e assim por diante. Uma função inline não é expandida como macros de pré-compilação. Eles são compilados exatamente como o código regular, mas podem ser então injetados (por falta de um termo melhor) no código compilado e otimizados conforme necessário.

6
WhozCraig

Não inline não é igual à definição de macro, já que a macro é preprocessada, mas inline é apenas a indicação para o compilador colocar todo o corpo da função onde é chamado.

colocar a palavra-chave inline antes de qualquer definição de função é apenas a indicação ou pedido, o compilador é livre para escolher se ele vai fazer essa função em linha ou deixá-la como normal 

substituição de macro: preprocessing phase (ou seja, antes da compilação) 

- arquivo de entrada test.cresult file in linux test.i

substituição inline: compilation phase 

1
Omkant