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에서는 중복된 정의로 인식 되기 때문에 링커에서 에러가 발생한다.