Unidade de tradução (programação) - Translation unit (programming)
Na terminologia da linguagem de programação C e C ++ , uma unidade de tradução (ou mais casualmente uma unidade de compilação) é a entrada final para um compilador C ou C ++ a partir do qual um arquivo-objeto é gerado. Uma unidade de tradução consiste aproximadamente em um arquivo de origem após ter sido processado pelo pré-processador C , o que significa que os arquivos de cabeçalho listados nas #include diretivas são literalmente incluídos , as seções do código #ifndef podem ser incluídas e as macros foram expandidas.
Contexto
Programa AC consiste em unidades chamadas de arquivos de origem (ou pré-processamento de arquivos ), que, além de código fonte, inclui diretrizes para o pré-processador C . Uma unidade de tradução é a saída do pré-processador C - um arquivo de origem após ter sido pré-processado .
O pré-processamento consiste notavelmente em expandir um arquivo de origem para substituir recursivamente todas as #include diretivas com o arquivo literal declarado na diretiva (geralmente arquivos de cabeçalho , mas possivelmente outros arquivos de origem); o resultado desta etapa é uma unidade de tradução de pré - processamento . Outras etapas incluem expansão macro de #define diretivas e compilação condicional de #ifdef diretivas, entre outros; isso traduz a unidade de tradução de pré-processamento em uma unidade de tradução . A partir de uma unidade de tradução, o compilador gera um arquivo-objeto , que pode ser posteriormente processado e vinculado (possivelmente com outros arquivos-objeto) para formar um programa executável .
Observe que o pré-processador é, em princípio, agnóstico de linguagem e é um pré-processador léxico , trabalhando no nível de análise lexical - ele não faz análise sintática e, portanto, é incapaz de fazer qualquer processamento específico para a sintaxe C. A entrada para o compilador é a unidade de tradução e, portanto, ele não vê nenhuma diretiva de pré-processador, que foi processada antes do início da compilação. Embora uma determinada unidade de tradução seja fundamentalmente baseada em um arquivo, o código-fonte real alimentado no compilador pode parecer substancialmente diferente do arquivo-fonte que o programador visualiza, particularmente devido à inclusão recursiva de cabeçalhos.
Alcance
As unidades de tradução definem um escopo , aproximadamente o escopo do arquivo e funcionando de forma semelhante ao escopo do módulo ; na terminologia C, isso é referido como ligação interna , que é uma das duas formas de ligação em C. Os nomes (funções e variáveis) declarados fora de um bloco de funções podem ser visíveis apenas dentro de uma determinada unidade de tradução, caso em que eles são considerados como tendo vínculo interno - eles não são visíveis para o vinculador - ou podem ser visíveis para outros arquivos de objeto, caso em que é dito que eles têm vínculo externo e são visíveis para o vinculador.
C não tem noção de módulos. No entanto, arquivos de objeto separados (e, portanto, também as unidades de tradução usadas para produzir arquivos de objeto) funcionam de forma semelhante a módulos separados, e se um arquivo de origem não incluir outros arquivos de origem, a ligação interna (escopo da unidade de tradução) pode ser considerada como "arquivo escopo, incluindo todos os arquivos de cabeçalho ".
Organização de código
A maior parte do código de um projeto é normalmente mantida em arquivos com um .c sufixo (ou .cpp , .cxx ou .cc para C ++ , dos quais .cpp é usado mais convencionalmente). Os arquivos destinados a serem incluídos normalmente têm um .h sufixo ( .hpp ou .hh também são usados para C ++, mas .h é o mais comum até para C ++) e geralmente não contêm definições de função ou variável para evitar conflitos de nome quando os cabeçalhos são incluídos em vários arquivos de origem, como frequentemente é o caso. Arquivos de cabeçalho podem ser, e freqüentemente são, incluídos em outros arquivos de cabeçalho. É prática padrão que todos os .c arquivos em um projeto incluam pelo menos um .h arquivo.