문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 링커 (문단 편집) == ODR (One Definition Rule) == 프로그래밍 언어에서 주의해야 하는 점은 2개 이상의 같은 이름의 심볼이 존재해서는 안된다는 것이다. 이를 ODR (One Definition Rule)라고 부른다. 예를 들어 한 소스 코드에 NamuWiki라는 심볼을 정의하고 또 다른 소스 코드에서 NamuWiki라는 심볼을 정의하면 컴파일에서는 문제가 없지만 링킹 단계에서 에러가 발생하게 된다. 이는 링커가 여러 소스 코드의 결과물을 하나로 합치는 과정에서 각 소스 코드에 있는 똑같은 이름의 심볼이 중복되었기 때문이다. C/C++ 초보자가 흔히 자주 애를 먹게 되는 문제. 한 헤더 파일을 만들고 2개 이상의 소스코드에서 사용할 경우 발생하기 쉽다. 그래서 헤더 파일을 만들 때 아래와 같이 Include Guard를 작성하면 좋다. {{{#!syntax cpp #ifndef HEADER_FILE_NAME_H #define HEADER_FILE_NAME_H // 헤더 파일 내용 작성... #endif}}} 이것 외에는 #pragma once도 있는데 위와 다르게 한줄만 쓰면 되므로 편리해진다. 다만 비표준 문법이라 일부 컴파일러에서 지원하지 않는 경우가 있으므로 주의해야 한다. {{{#!syntax cpp #pragma once // 헤더 파일 내용 작성...}}} 참고로 [[비주얼 스튜디오]]에서 헤더 파일을 만들면 자동으로 맨 윗줄에 붙여있다. 또한 헤더 파일 안에 심볼을 정의만 해줘야 한다. 즉 int NamuWiki; 처럼 정의만 하고 int NamuWiki = 0; 처럼 정의와 동시에 초기화하면 안된다는 말이다. 이렇게 되면 링커 단계에서 에러가 발생한다. 따라서 헤더 파일에 정의만 하고 한 개의 소스 코드에서 값을 초기화시켜 주거나 static Storage class를 지정해 심볼이 노출되지 않도록 해 줘야 한다. 다만 [[인라인 함수]]는 ODR 문제에서 자유롭다. 인라인 함수을 헤더 파일에서 작성하고 여러 소스 코드에서 사용하더라도 컴파일러 단계에서 내부적으로 치환이 완료되고 심볼은 노출되지 않기 때문에 문제 없이 링킹을 해준다. 물론 같은 이름의 인라인 함수를 한 소스 코드에서 중복해서 작성하거나 이름만 같을 뿐 내용을 다르게 작성할 경우 링킹 단계 이전의 컴파일러 단계에서 에러가 난다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기