C ++의 "번역 단위"란 무엇입니까


236

당시 Meyers가 작성한 "Effective C ++"을 읽고 "번역 단위"라는 용어를 사용했습니다.

누군가 나에게 설명을 해 줄 수 있습니까?

1) 정확히 무엇입니까

2) C ++로 프로그래밍 할 때 언제 사용해야합니까?

3) C ++에만 관련되거나 다른 프로그래밍 언어와 함께 사용할 수있는 경우

용어를 모른 채 이미 사용했을 수도 있습니다 ....


1
2. 헤더 파일이 포함 된 경우 이미 번역 단위를 사용하고 있습니다. 그것은 참조에 사용되는 용어가 아니라 말 당 C ++ 구조입니다
talekeDskobeDa

답변:


268

에서 여기 ( 뒤로 기계 링크 )

표준 C ++ ( wayback machine link ) 에 따르면 : 변환 단위는 C ++에서 컴파일의 기본 단위입니다. 단일 소스 파일의 내용과 직접 또는 간접적으로 포함 된 헤더 파일의 내용에서 조건부 전처리 명령문을 사용하여 무시 된 행을 제외한 내용으로 구성됩니다.

단일 변환 단위는 오브젝트 파일, 라이브러리 또는 실행 가능 프로그램으로 컴파일 될 수 있습니다.

번역 단위의 개념은 단일 정의 규칙과 템플릿의 맥락에서 가장 자주 언급됩니다.


9
이 용어는 C / C ++에서만 사용됩니까?
dekuShrub

2
사실 @dekuShrub은 아닙니다. 예를 들어, Rust에서 번역 단위는 크레이트이며 C ++에서는 같은 것이 전체 라이브러리라고합니다. 용어 자체는 보편적이지만 C로 시작했습니다.
Sahsahae

이 답변의 내용을 대략적으로 설명하는 새로운 참조 : en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples

67

번역 단위는, 모든 의도와 목적 파일 (이 .c / cpp를)입니다 이 헤더 파일을 모두 포함 끝났어.

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


3
헤더 파일 포함 코드가 생성되지 않더라도 헤더 파일은 컴파일러에서 처리됩니다. JeffH의 전 처리기 주석을 참조하십시오. "컴파일러가 보는 모든 것"이라는 정의는 좋은 것입니다.
Marco van de Voort

10
".h"로 끝나는 파일은 잘 컴파일 할 수 있습니다. 파일 이름은 전혀 중요하지 않습니다. 내용은 "foo.h"의 내용이 "int main () {}"이면 컴파일 할 수 있습니다.
Johannes Schaub-litb

@LightnessRacesinOrbit : 예, 말하려고하는 것은 포함을 통해 간접적으로 TU로 헤더를 컴파일하는 대신 헤더를 TU로 직접 컴파일하는 것이 정통하지 않다는 것입니다. 명백히 잘못되었다는 첫 번째 설명을 삭제하고 두 번째 설명은 새로운 설명을 제공합니다.
GManNickG 2013

1
@GManNickG : ".h 파일은 일반적으로 컴파일러에 직접 공급되지 않습니다."
궤도에서 가벼움 경주

@ JohannesSchaub-litb 컴파일이 아니라 링크를 의미한다고 생각합니다. 모든 이름이 정의 된 적절한 C / C ++ 인 한 파일을 컴파일 할 수 있습니다. 헤더 파일의 전체 지점을 소스 파일에 포함 (읽기 복사)해야하므로 헤더 파일을 포함하는 소스 파일을 컴파일 할 때 이미 컴파일되고 있으므로 헤더 파일을 컴파일하는 것은 쓸모가 없습니다. 당신이 말하고자하는 것은 주 기능이없는 파일에서 실행 파일을 만들 수 없다는 것입니다.
pooya13

30

확실히 대답하기 어려운 질문입니다. C ++ 표준은 다음과 같이 말합니다.

프로그램의 텍스트는이 국제 표준에서 소스 파일이라고하는 단위로 유지됩니다. 전처리 지시문 #include를 통해 모든 헤더 (17.4.1.2) 및 포함 된 소스 파일 (16.2)과 함께 소스 파일을 조건부 포함 (16.1) 전처리 지시문으로 건너 뛴 소스 행을 변환 단위라고합니다. [참고 : C ++ 프로그램을 동시에 번역 할 필요는 없습니다. ]

따라서 대부분의 의도와 목적을 위해 변환 단위는 단일 C ++ 소스 파일과 전 처리기 #include 메커니즘을 통해 포함 된 헤더 또는 기타 파일입니다.

다른 질문과 관련하여 :

2) C ++로 프로그래밍 할 때 언제 사용해야합니까?

당신은 그것을 고려할 수 없습니다-번역 단위는 C ++ 프로그램의 기초입니다.

3) C ++에만 관련되거나 다른 프로그래밍 언어와 함께 사용할 수있는 경우

다른 언어들도 비슷한 개념을 가지고 있지만 그 의미는 미묘하게 다릅니다. 예를 들어 대부분의 다른 언어는 전처리기를 사용하지 않습니다.


1
그게 분명한지 모르겠습니다. 이것은 다소 어두운 영역 일 수 있습니다-예를 들어 미리 컴파일 된 헤더가 허용된다는 인용 된 표준 매개 변수는 명확하지 않습니다.

1
@GMan, 여기에서 하나의 정의 규칙에 대해 매우주의해야합니다. 클래스가 포함되기 전에 정의가 약간 다른 다른 번역 단위에 클래스를 포함 시키면 클래스에 다른 코드가 생겨 정의되지 않은 문제가 발생합니다.
Matt Price

6
@GMan은 표준에서 사용하는 두 가지 용어 인 "헤더"와 "소스 파일"에 주목합니다. "헤더"는 표준 라이브러리에만 사용됩니다. 일부 코드에 포함 된 사용자 파일은 표준에서 "헤더"라고하는 것이 아니라 "소스 파일"입니다. 표준은 우리가 가난한 C ++ 프로그래머들이 만들어 낸 ".h"와 ".cpp"의 차이점에 대해 모른다. :)
Johannes Schaub-litb

8

이 책은 그것을 충분히 명확하게합니다. Meyers가 "번역 단위"를 지칭 할 때, 그는 소스 코드 파일을 의미합니다.


1
소스 코드에 대해 이야기하고 있다면 소스 파일이라고 말할 수 있습니다. 번역 단위는 소스 코드를 컴파일하여 만들어집니다. 뚜렷한 차이점에 유의하십시오. "번역 된"소스 코드입니다.
Dan

3
@ 단 : 아니오, 그렇지 않습니다. 변환 단위는 컴파일 후의 전 처리기 출력을 컴파일 할 수 있는 소스 파일 입니다.
Ed S.

1
실제로 C ++ 표준에서 호출하는 내용에도 불구하고 "번역 단위"는 일반적으로 컴파일 된 코드의 단일 "단위"에 대한 아이디어를 전달하는 데 사용됩니다. 실제로 Microsoft 컴파일러 사용자에 따르면 "번역 단위"를 직접 연결합니다. msdn.microsoft.com/ko-kr/library/vstudio/…
Dan

1
그래서 우리는 "C ++ 표준"나치가 되려고 노력하고 있습니까? 나는 이것이 C ++ 스레드라는 것을 알고 있으므로 xcode가 tu라고 부르는 것에 들어 가지 않을 것입니다. 또는 용어의 다른 모든 정의.
Dan

1
@Dan : 번역 단위는 표준이라고합니다. 임의의 컴파일러 개발자의 의견에는 실제로 신경 쓰지 않습니다. 거의 5 살짜리 게시물을 nitpick에 파고 내 정의가 잘못되었다고 말하는 사람이 나를 돌아 서서 그를 교정하는 "언어 나치"라고 부릅니다. Yeesh, 계속해서, 당신은 다루기 힘들다.
Ed S.

4

ODR 외에도 변환 단위는 이름이없는 네임 스페이스를 정의하는 데 중요합니다.이 네임 스페이스는 이전의 "정적"사용 중 하나를 대체합니다.

나는 여전히 최상위 답변 아래에 의견을 추가하기에 충분한 점수가 없다고 생각합니다.


3

변환 단위는 적절한 컴파일러에 전달되는 코드입니다. 이는 일반적으로 .c 파일에서 프리 프로세서를 실행 한 결과를 의미합니다.


2

C 및 C ++ 프로그램은 하나 이상의 소스 파일로 구성되며 각 파일에는 프로그램의 일부 텍스트가 포함됩니다. 소스 파일과 포함 파일 (#include 전 처리기 지시문을 사용하여 포함 된 파일)과 함께 #if와 같은 조건부 컴파일 지시문으로 제거 된 코드 섹션은 "변환 단위"라고합니다.


1

MSDN 에 따르면 : C 및 C ++ 프로그램은 하나 이상의 소스 파일로 구성되며 각 파일에는 프로그램의 일부 텍스트가 포함됩니다. 소스 파일과 포함 파일 (#include 전 처리기 지시문을 사용하여 포함 된 파일)과 함께 #if와 같은 조건부 컴파일 지시문으로 제거 된 코드 섹션은 "변환 단위"라고합니다.


0

모든 cpp / c (구현) 파일은 cpp 파일의 변환 단위 (즉, 객체 파일 (.obj)) 헤더로 변환되어 헤더 파일의 실제 텍스트로 바뀝니다.


0

다른 사람들이 말했듯이 변환 단위는 기본적으로 전처리 후 소스 파일의 내용입니다. 언어 문법에서 가장 높은 작품입니다. C 또는 C ++ 컴파일러를 작성하는 경우에만 걱정하면됩니다.


1
"C 또는 C ++ 컴파일러를 작성하는 경우에만 걱정하면됩니다." 나는 동의하지 않는다. 프로그래머들은 종종 컴파일러가하는 일을 이해해야한다. 따라서, 예를 들어, 유효 C ++의 항목 # 5에서 중요한 점을 이해하려면 번역 단위가 무엇인지 알아야합니다. "다른 번역 단위에 정의 된 로컬이 아닌 정적 객체의 상대적 초기화 순서는 정의되어 있지 않습니다".
채닝 무어

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.