Funções macro vs. estáticas no cabeçalho

9

Para muitas tarefas rápidas em que se poderia empregar uma função f(x,y), em C simples, são usadas macros. Gostaria de perguntar especificamente sobre esses casos, que podem ser solucionados por uma chamada de função (ou seja, macros usadas para embutir funções, não para expansão de código arbitrário).

Normalmente, as funções C não estão embutidas, pois podem estar vinculadas a outros arquivos C. No entanto, as funções C estáticas são visíveis apenas no arquivo C em que estão definidas. Portanto, elas podem ser incorporadas pelos compiladores. Ouvi dizer que muitas macros devem ser substituídas, transformando-as em funções estáticas, porque isso produz código mais seguro.

Existem casos em que essa não é uma boa ideia?

Novamente: Não pergunte sobre macros de produção de código com construções iguais a ## que não podem ser expressas como uma função.

wirrbel
fonte
escrevendo uma macro adequada é uma dor, e inlineing funções apenas garante que pode ser definido várias vezes no binário, o compilador pode decidir se ele vai realmente em linha-lo para talvez economizar espaço
catraca aberração
2
Eu realmente suspeitaria que a maioria dessas são razões históricas. Idade atrás, os compiladores C não tinham funções incorporadas. Então, as pessoas usavam macros para as coisas que eles queriam incluir. O código C geralmente é de longa duração.
Jan Hudec
@ ratchetfreak: C não tem inline, não se trata de C ++.
Wirrbel #
2
@wirrbel Claro que existe inlineem C, pelo menos desde C99. Para uma visão geral rápida, consulte Wikipedia sobre funções embutidas .
quer

Respostas:

6

As macros solucionáveis ​​por uma chamada de função têm muitas armadilhas:

  • Eles são difíceis de escrever, porque você pode ter que lidar com argumentos apropriados, como ++i.
  • Eles são difíceis de depurar com um depurador visual, pois você não pode percorrer uma macro ou colocar um ponto de interrupção lá.
  • Eles são difíceis de manipular corretamente ao analisar dependências de compilações.

Macros que são solucionáveis ​​por uma chamada de função podem ter sido úteis para fornecer inlining em um compilador primitivo. Não conheço nenhum compilador que não lide com funções embutidas e alguns podem até embutir nas unidades de compilação.

Normalmente, as funções C não estão embutidas, pois podem estar vinculadas a outros arquivos C.

Não há razão para que um compilador não consiga fornecer duas versões de uma função, uma called tradicional e uma inlined. Você deve olhar para a documentação do compilador que está direcionando. Além disso, convém examinar a montagem gerada: mesmo se você não conhece a montagem, pode aprender rapidamente a saber se alguma função foi incorporada ou não. (Comece com exemplos de bebês para aprender rapidamente isso.)

user40989
fonte