O que é uma "unidade de tradução" em C ++

236

Eu estava lendo na época o "C ++ eficaz", escrito por Meyers, e me deparei com o termo "unidade de tradução".

Alguém poderia me dar uma explicação sobre:

1) O que exatamente é

2) Quando devo considerar usá-lo ao programar com C ++

3) Se estiver relacionado apenas ao C ++, ou pode ser usado com outras linguagens de programação

Eu já posso usá-lo sem conhecer o termo ....

atormentar
fonte
1
2. Você já está usando a unidade de tradução se tiver incluído os arquivos de cabeçalho. É um termo usado para referência e não um c ++ construo por exemplo
talekeDskobeDa

Respostas:

268

A partir daqui : ( link da máquina de retorno )

De acordo com o C ++ padrão ( link da máquina de retorno ): Uma unidade de tradução é a unidade básica de compilação em C ++. Consiste no conteúdo de um único arquivo de origem, mais o conteúdo de qualquer arquivo de cabeçalho incluído direta ou indiretamente por ele, menos as linhas que foram ignoradas usando instruções de pré-processamento condicional.

Uma única unidade de tradução pode ser compilada em um arquivo de objeto, biblioteca ou programa executável.

A noção de unidade de tradução é mais frequentemente mencionada nos contextos da regra de definição única e nos modelos.

JeffH
fonte
9
O termo é usado apenas em C / C ++?
precisa saber é o seguinte
2
@dekuShrub por uma questão de fato, não. Por exemplo, no Rust, uma unidade de tradução é uma caixa, em C ++ a mesma coisa seria chamada de uma biblioteca inteira. O termo em si é universal, mas definitivamente começou com C.
Sahsahae 06/12/19
Nova referência que indica aproximadamente o que esta resposta indica: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples
67

Uma unidade de tradução é, para todos os efeitos, um arquivo (.c / .cpp), após a conclusão, incluindo todos os arquivos de cabeçalho.

http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx

Ana Betts
fonte
3
Incluindo arquivos de cabeçalho. Os arquivos de cabeçalho são processados ​​pelo compilador, mesmo que nenhum código seja gerado. Veja também o comentário do pré-processador de JeffH, a definição "tudo o que o compilador vê" é boa.
Marco van de Voort
10
Você pode compilar arquivos que terminem em ".h". O nome do arquivo não é importante. O conteúdo é. Se o conteúdo de "foo.h" for "int main () {}", você poderá compilá-lo.
Johannes Schaub - litb
@LightnessRacesinOrbit: Sim, o que eu estava tentando dizer era que não é ortodoxo compilar diretamente um cabeçalho como uma TU, em vez de compilar indiretamente em uma TU via inclusão. O primeiro comentário foi excluído por estar completamente errado, mantendo o segundo para dar contexto aos novos.
GManNickG 4/13/13
1
@GManNickG: Que tal "arquivos .h convencionalmente não são alimentados diretamente no compilador".
Lightness Races em órbita
@ JohannesSchaub-litb Acho que você quer dizer link, não compilação. Você pode compilar qualquer arquivo, desde que seja C / C ++ adequado, com todos os nomes definidos. Seria inútil compilar um arquivo de cabeçalho, pois todo o ponto de um arquivo de cabeçalho deve ser incluído (lido copiado) nos arquivos de origem; portanto, eles já estão sendo compilados quando você compila um arquivo de origem que o inclui. Eu acho que o que você quis dizer é que não é possível criar um executável a partir de um arquivo que não possui uma função principal.
pooya13
30

Uma pergunta difícil de responder definitivamente. O padrão C ++ declara:

O texto do programa é mantido em unidades chamadas arquivos de origem nesta Norma. Um arquivo de origem, juntamente com todos os cabeçalhos (17.4.1.2) e os arquivos de origem incluídos (16.2) por meio da diretiva de pré-processamento #include, menos as linhas de origem ignoradas por qualquer uma das diretivas de pré-processamento de inclusão condicional (16.1), é chamada de unidade de tradução. [Nota: nem todos os programas C ++ devem ser traduzidos ao mesmo tempo. ]

Portanto, para a maioria das intenções e propósitos, uma unidade de tradução é um único arquivo de origem C ++ e o cabeçalho ou outros arquivos incluídos pelo mecanismo #include do pré-processador.

Em relação às suas outras perguntas:

2) Quando devo considerar usá-lo ao programar com C ++

Você não pode deixar de considerá-lo - as unidades de tradução são a base de um programa C ++.

3) Se estiver relacionado apenas ao C ++, ou pode ser usado com outras linguagens de programação

Outras línguas têm conceitos semelhantes, mas sua semântica será sutilmente diferente. A maioria dos outros idiomas não usa um pré-processador, por exemplo.

Ondrej Slinták
fonte
1
Não sei se isso esclarece ou não. Essa pode ser uma área um tanto obscura - não está claro no parágrafo padrão citado que cabeçalhos pré-compilados são permitidos, por exemplo.
1
@ GMan, e é aí que você deve ter muito cuidado com a regra de uma definição. Se você incluir uma classe em diferentes unidades de tradução com definições ligeiramente diferentes antes da inclusão da classe, que faz com que a classe tenha um código diferente, causará problemas indefinidos.
Matt Price
6
@GMan observe os dois termos usados ​​pelo padrão: "cabeçalho" e "arquivo de origem". "header" é usado apenas para a biblioteca Standard. Um arquivo de usuário incluído por algum código não é chamado de "cabeçalho" pelo padrão, mas "arquivo de origem". A Norma não saber sobre a diferença entre ".h" e "CPP" que nós pobres c ++ programadores composta :)
Johannes Schaub - litb
8

O livro deixa claro o suficiente. Quando Meyers se refere a uma "unidade de tradução", ele significa um arquivo de código-fonte.

Ed S.
fonte
1
Não. Se ele estivesse falando sobre o código fonte, diria arquivos fonte. A unidade de tradução é feita compilando o código fonte. Observe a diferença distinta. É o código fonte "traduzido".
22414 Dan
3
@ Dan: Não, não é. Uma unidade de tradução é um arquivo de origem após inclusões que podem ser compiladas, ou seja, a saída do pré-processador antes da compilação.
Ed S.
1
De fato, apesar do que o padrão C ++ chama, "unidade de tradução" é comumente usada para comunicar a idéia de uma única "unidade" de código compilado. De fato, de acordo com o pessoal do compilador da Microsoft, você vincula "Unidades de tradução" diretamente. msdn.microsoft.com/en-us/library/vstudio/…
Dan
1
Então, estamos tentando ser nazistas "padrão C ++" ou estamos tentando ajudar as pessoas a se comunicarem com o resto da indústria? Eu sei que este é um thread C ++, então eu não vou para o que xcode chama de tu. Ou todas as outras definições do termo.
22414 Dan
1
@ Dan: Uma unidade de tradução é o que o padrão chama. Não estou realmente preocupado com a opinião de desenvolvedores de compiladores aleatórios. Interessante que o cara que desenterra um post de quase cinco anos para dar uma espiada e me diga que minha definição está errada se vira e me chama de "naz da língua" para corrigir a dele. Sim, siga em frente, você está cansado de lidar.
Ed S.
4

Além do ODR, a unidade de tradução é importante na definição de namespaces não nomeados, que substitui um dos antigos usos de "estático".

Acho que ainda não tenho pontos suficientes para adicionar um comentário na resposta superior.

Allan Stokes
fonte
3

Uma unidade de tradução é um código que é passado para o compilador propriamente dito. Isso normalmente significa que a saída está executando o pré-processador no arquivo .c.

sigjuice
fonte
2

Os programas C e C ++ consistem em um ou mais arquivos de origem, cada um dos quais contém parte do texto do programa. Um arquivo de origem, juntamente com seus arquivos de inclusão (arquivos incluídos usando a diretiva de pré-processador #include), mas não incluindo seções de código removidas por diretivas de compilação condicional, como #if, é chamado de "unidade de tradução".

ganesh marmat
fonte
1

De acordo com o MSDN : os programas C e C ++ consistem em um ou mais arquivos de origem, cada um dos quais contém parte do texto do programa. Um arquivo de origem, juntamente com seus arquivos de inclusão (arquivos incluídos usando a diretiva de pré-processador #include), mas não incluindo seções de código removidas por diretivas de compilação condicional como #if, é chamado de "unidade de tradução".

rahul
fonte
0

Cada arquivo cpp / c (implementação) será convertido em uma unidade de tradução (por exemplo, arquivo de objeto (.obj)). Os cabeçalhos no arquivo cpp serão substituídos pelo texto real dos arquivos de cabeçalho.

yesraaj
fonte
0

Como já foi dito, uma unidade de tradução é basicamente o conteúdo de um arquivo de origem após o pré-processamento. É a melhor produção na gramática da linguagem; você só precisaria se preocupar com isso se estivesse escrevendo um compilador C ou C ++.

John Bode
fonte
1
"você só precisaria se preocupar com isso se estivesse escrevendo um compilador C ou C ++." Eu discordo: os programadores geralmente precisam entender o que o compilador está fazendo. Assim, por exemplo, você precisa saber o que é uma unidade de tradução para entender um ponto importante do item # 5 no C ++ efetivo: "a ordem relativa de inicialização de objetos estáticos não locais definidos em diferentes unidades de tradução é indefinida".
Channing Moore,