2
respostas

[Dúvida] Unidade de tradução

Esse site fala algo diferente sobre unidade de tradução: https://learn.microsoft.com/pt-br/cpp/cpp/program-and-linkage-cpp?view=msvc-170 "Uma unidade de tradução consiste em um arquivo de implementação e todos os cabeçalhos que ele inclui direta ou indiretamente. Os arquivos de implementação normalmente têm uma extensão de arquivo de .cpp ou .cxx. "

A unidade de tradução é o arquivo que escrevemos? Ou é algo gerado pelo pré-processamento de um arquivo como menciona o exercício?

2 respostas

Complementando a minha dúvida.

A alternativa 3 diz o seguinte:

Alternativa errada! Uma unidade de tradução ainda precisa ser compilada antes de gerar um código objeto. O código de objeto que pode ser usado para realizar linking e gerar o executável.

Mas no vídeo aula seguinte ele chama o arquivo .o de unidade de tradução. Ou seja seja unidade de tradução e código objeto é a mesma coisa segundo o professor.

Olá Luís!

Para o compilador gerar um executável, ele compila todas as unidades de tradução em arquivos objeto (".obj" ou ".o") e depois realiza o link entre essas esses arquivos.

A unidade de tradução pode ser definida, de maneira simples, como um conjunto de arquivos que o compilador pode complilar, de maneira independente, para gerar os arquivos objeto.

Em resumo: é o arquivo ".cpp" junto á todos os cabeçalhos que nele estão incluídos, isso pode ser considerado uma unidade de tradução.

os arquivos objeto (".o") não são a unidade de tradução em si, mas sim o resultado da compilação dessas unidades.

O que o compilador faz quando vc compila com "g++" ou "gcc" é basicamente realizar todo esse processo de "converter" as unidades de tradução em arquivos ".o" e logo em seguida realizar o link diretamente.

vc pode utilizar o parâmetro "-c" para o compilador realizar apenas "converção" para arquivo ".o" para depois vc realizar o link.

Vou dar um exemplo de um arquivo "main.cpp" que incluiu um arquivo "produto.h", e um "produto.cpp" que também incluiu o "produto.h". Percebe-se que ambos NÃO dependem um do outro (main.cpp e produtos.cpp), já que são unidades de tradução diferentes, assim vamos primeiro converter essas duas unidades em arquivos objetos para depois realizar o link:

#listar arquivos no diretório
user$: ls
main.cpp produto.h produto.cpp

#realizar apenas a compilação das unidades de tradução (SEM o link)
user$: g++ -c main.cpp produto.cpp

#note que apareceu os arquivos ".o"
user$: ls
main.cpp produto.h produto.cpp  main.o produto.o

#realizando o link
user$: g++  main.o produto.o

Conclusão: uma unidade de tradução são os arquivos ".cpp" que vc escreve junto aos arquivos de cabeçalho que esse arquivo inclui. Um código pode conter várias unidades de tradução (geralmente em programação orientada a objetos, cada classe é uma unidade de tradução diferente, pois vc pode compilar os arquivos de implementação dos métodos da classe independente do resto do código).

Espero ter ajudado! caso não, é só pedir que eu dou mais exemplos.

Caso tenha entendido, peço que marque esse post como solução, por gentileza.

Bons estudos :)