[C++] 단일 정의 원칙(One Definition Rule)

김진우·2025년 6월 7일

C++

목록 보기
15/16
post-thumbnail

정의

ODR은 같은 엔티티(예: 변수, 함수, 클래스 등) 가 프로그램 전체에서 정의는 단 한 번만 존재해야 한다는 규칙이다.

적용 대상

  • 변수
  • 함수
  • 클래스/구조체/열거형
  • 템플릿 인스턴스화

예시

// header.h
extern int count;  // 선언
-------------------------------------
// a.cpp
#include "header.h"
int count = 42;    // 정의
-------------------------------------
// b.cpp
#include "header.h" // 선언만 있음

다음과 같이 세 파일에 코드가 있을 경우, 링커는 정의가 하나만 있기 때문에 ODR 원칙에 위배되지 않는다.

만약 a.cpp, b.cpp 파일이 다음과 같이 변경 된다면

// a.cpp
int count = 1; // 정의
-------------------------------------
// b.cpp
int count = 2; // 중복된 정의 

extern으로 참조하는 header.h에서는 중복된 정의로 인식 되기 때문에 링커에서 에러가 발생한다.

예방법

  1. header에서는 정의를 하지 않고 선언만 한다.
  2. #pragma once 또는 include guard를 사용해 헤더 중복 포함을 방지한다.
  3. inline으로 선언해 중복 정의가 가능하지만, 값이 모두 같아야 한다.

0개의 댓글