Estou lendo 'The Standard C Library' de PJ Plauger, o que é realmente interessante. O livro explica não apenas como USAR a biblioteca, mas também como ela é implementada.
Eu terminei de ler a ctype.h
seção e no cabeçalho as funções são declaradas como macros AND. Por exemplo
int isdigit(int);
mas também
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
Eu não entendo por que AMBOS são usados?
Além disso, se eu tentar recriar meu próprio ctype
cabeçalho e implementação personalizados , só posso compilar com êxito se remover a macro (comente a definição).
Este aspecto não foi realmente explicado no livro. Alguém pode me explicar?
Respostas:
A macro é (putativamente) mais eficiente, pois não envolve uma chamada de função. Ele pode ser otimizado mais facilmente, pois envolve apenas uma pesquisa de deslocamento do ponteiro.
A chamada de função permite vincular a mesma biblioteca, mesmo que o programa tenha sido compilado sem a definição de macro - se ele foi compilado com um cabeçalho diferente ou apenas com uma declaração não autorizada dentro do arquivo de origem. Por exemplo, se você tiver um compilador com a versão "aprimorada" de ctype.h de alguém que não possui a macro, a função ainda existiria no tempo de execução para uso.
Se olharmos para o padrão:
Isso significa que se você escrever:
ou
então você está invocando a função real, não a macro. Você também pode escrever legalmente:
ou (em um arquivo de origem que não tenha
#include <ctype.h>
direta ou transitivamente):fonte
extern int isdigit(int)
, por exemplo.