Что такое «единица перевода» в C ++ - PullRequest
209 голосов
/ 10 июля 2009

Я читаю в то время "Эффективный C ++", написанный Мейерсом и наткнулся на термин «единица перевода».

Может кто-нибудь дать мне объяснение:

1) Что именно это

2) Когда я должен рассмотреть возможность его использования при программировании на C ++

3) Если оно относится только к C ++ или может использоваться с другими языками программирования

Я мог бы уже использовать его, не зная термина ....

Ответы [ 11 ]

239 голосов
/ 10 июля 2009

С здесь : ( обратная связь с машиной )

Согласно стандарту C ++ ( обратная связь с машиной ): Единица перевода является основной единицей компиляции в C ++. Это состоит из содержимое одного исходного файла, плюс содержимое любых заголовочных файлов прямо или косвенно включен, минус те строки, которые были проигнорированы с использованием условной предварительной обработки заявления.

Одна единица перевода может быть скомпилирован в объектный файл, библиотеку, или исполняемая программа.

Понятие единицы перевода чаще всего упоминается в контексте правила единого определения, и шаблоны.

57 голосов
/ 10 июля 2009

Единицей перевода для всех намерений и целей является файл (.c / .cpp), после он завершен, включая все файлы заголовков.

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

26 голосов
/ 10 июля 2009

Сложный вопрос, чтобы ответить окончательно. Стандарт C ++ гласит:

Текст программы хранится в единицах, называемых исходными файлами в этом международном стандарте. Исходный файл вместе со всеми заголовками (17.4.1.2) и включенными исходными файлами (16.2) через директива предварительной обработки #include, за исключением строк исходного кода, пропущенных любым из условное включение (16.1) директивы предварительной обработки, называется переводной единицей. [Примечание: C ++ Программа не обязательно должна быть переведена на в то же время. ]

Таким образом, для большинства целей и задач единица перевода - это отдельный исходный файл C ++ и заголовок или другие файлы, которые он включает с помощью механизма препроцессора #include.

По другим вопросам:

2) Когда я должен рассмотреть возможность его использования при программировании на C ++

Вы не можете не учитывать это - единицы перевода являются основой программы на C ++.

3) Если это относится только к C ++ или может использоваться с другим программированием языки

Другие языки имеют сходные понятия, но их семантика будет немного отличаться. Например, большинство других языков не используют препроцессор.

8 голосов
/ 10 июля 2009

Книга проясняет это достаточно. Когда Мейерс ссылается на «Единицу перевода», он имеет в виду файл исходного кода.

4 голосов
/ 11 ноября 2011

В дополнение к ODR, модуль перевода важен в определении безымянных пространств имен, который заменяет одно из старых применений «статического».

Полагаю, мне все еще не хватает очков, чтобы добавить комментарий под верхним ответом.

3 голосов
/ 10 июля 2009

Единица перевода - это код, который передается компилятору. Как правило, это означает результат запуска препроцессора для файла .c.

2 голосов
/ 18 марта 2015

C и C ++ программы состоят из одного или нескольких исходных файлов, каждый из которых содержит некоторый текст программы. Исходный файл вместе с включаемыми файлами (файлы, включаемые с использованием директивы препроцессора #include), но не включающий в себя фрагменты кода, удаленные директивами условной компиляции, такими как #if, называется «единицей перевода».

1 голос
/ 30 октября 2009

Согласно MSDN : программы на C и C ++ состоят из одного или нескольких исходных файлов, каждый из которых содержит некоторый текст программы. Исходный файл вместе с включаемыми файлами (файлы, включаемые с использованием директивы препроцессора #include), но не включающий в себя фрагменты кода, удаленные директивами условной компиляции, такими как #if, называется «единицей перевода».

0 голосов
/ 30 июля 2013

На мой взгляд, «единица перевода» обычно представляет собой один исходный файл «после предварительной обработки». Вы можете получить более подробную информацию на этой странице MSDN. http://msdn.microsoft.com/en-us/library/bxss3ska(v=vs.80).aspx

0 голосов
/ 10 июля 2009

Как уже говорили другие, единица перевода - это в основном содержимое исходного файла после предварительной обработки. Это самая лучшая постановка в языковой грамматике; вам нужно было бы беспокоиться только об этом, если бы вы писали компилятор C или C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...