O pré-processador C é anexado a C, mas possui uma sintaxe completamente diferente da linguagem principal:
espaço em branco sintaticamente significativo (o fim da linha termina uma instrução, intervalo após a macro determinar o início da lista de substituição)
blocos baseados em palavras-chave em vez de blocos apoiados, em
elif
vez deelse if
definições conduzidas por palavras-chave em vez de declaração-reflete-uso, não
=
para definição de valordicas de uma sintaxe de string alternativa (
#include <>
vs#include ""
)avaliação preguiçosa (de C, obviamente; mas 6.10.3.1 também pode ser entendida como implicando uma ordem específica de expansão macro, nos poucos lugares que importa)
Realmente não se parece com C! Tecnicamente, é sua própria linguagem, mas sempre foi usada como parte quase integral do C e parece muito estranho que não se integre sintaticamente a ele.
A Wikipedia não fala sobre sua história; o Portland Pattern Repository faz uma menção passageira , mas não entra em detalhes além do fato de ter sido projetado por outras pessoas que não o resto do site de C. Dennis Ritchie, com a história de C, provavelmente teve a resposta, mas infelizmente não existe. mais disponível.
Como um mecanismo de macro, obviamente possui semântica muito diferente da linguagem de tempo de execução, o que explicaria algumas diferenças, mas não os aspectos do design visual (também não está claro para os olhos modernos se ele foi originalmente concebido como capaz do tipo de diversão que seu sistema de substituição permite, ou se era "apenas" uma maneira conveniente de incorporar funções em um tempo antes de otimizadores poderosos). Parece que algo mais próximo do que acabou se transformando em modelos C ++ teria sido uma evolução mais lógica em relação às macros, se a semântica do tipo C tivesse realmente sido o ponto de partida, mas há menos evidência concreta disso do que a sintaxe.
Temos algum registro de por que foi projetado dessa maneira ou quais foram as influências dos criadores?