C 언어에서는 선언 (declaration)과 정의 (definition)를 구분합니다.
예:
// 선언 (extern) extern int global_var; int func(int); // 정의 int global_var = 42; int func(int x) { return x * 2; }
다중 모듈 프로젝트에서는 선언을 헤더 파일에 배치하여 모듈들이 서로에 대해 "알 수 있도록" 하고, 정의는 하나의 소스 파일에만 배치하여 링크 시 충돌을 방지합니다.
같은 변수의 여러 정의가 서로 다른 소스 파일에 있을 수 있습니까 (예: int flag = 0;), 동일한 헤더 파일을 포함하는 경우?
답변: 아니요! 헤더 파일에는 extern int flag;의 선언만 포함되어야 하며, 변수의 정의는 단 하나의 소스 파일(int flag = 0;)에만 있어야 합니다. 이를 지키지 않으면 다중 정의에 대한 링크 오류가 발생합니다.
이야기
대규모 프로젝트에서 전역 변수를 헤더 파일에
int counter = 0;로 "나누었습니다". 이 헤더를 include하여 정의가 중복되는 문제가 발생했습니다. 결과: CI/CD 빌드 시 링크 오류 - "multiple definition of counter".
이야기
함수 라이브러리에서 타입 사양 없이 함수 프로토타입을 작성하여, 컴파일러가 구식 선언으로 판단하고, 후에 모듈 간 함수 시그니처 불일치로 오류를 발생시켰습니다.
이야기
테스트 단계에서 일부 변수가 초기화되지 않았다는 사실이 드러났습니다. 이는
extern으로만 선언되었지만 어떤 모듈에서도 초기화되지 않았기 때문입니다. 이로 인해 쓰레기 값을 읽게 되고, 임베디드 플랫폼에서 복잡한 버그가 발생했습니다.