Что такое "единица перевода" в С++

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

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

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

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

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

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

Ответ 1

Из здесь: (ссылка на обратный путь)

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

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

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

Ответ 3

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

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

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

Что касается ваших других вопросов:

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

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

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

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

Ответ 4

В книге достаточно ясно. Когда Мейерс ссылается на "блок переводов", он означает файл исходного кода.

Ответ 5

В дополнение к ODR единица перевода важна в определении неназванных пространств имен, которое заменяет одно из старых применений "статического".

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

Каждый файл cpp/c (реализация) будет преобразован в блок перевода (т.е. объектный файл (.obj)) заголовки в файле cpp будут заменены фактическим текстом из файлов заголовков.

Ответ 10

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

Ответ 11

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