변수의 선언 및 초기화는 C 언어의 기초이며, 매우 엄격하고 때로는 명확하지 않은 규칙을 가집니다. 변수를 어떻게 그리고 어디서 선언했는지에 따라 초기값(초기화)와 메모리 객체와의 연결(선언과 정의)에 영향이 있습니다.
C는 메모리 최적화가 우선시되던 시절로 거슬러 올라갑니다. 개발자는 변수를 스스로 선언하고 초기화해야 했으며, 그렇지 않으면 프로그램의 동작이 예측할 수 없게 되었습니다. 현대 C 컴파일러에서는 작은 편차도 링킹 오류나 "쓰레기"로의 암묵적 초기화로 이어질 수 있습니다.
주요 오류는 다음과 같습니다:
코드 예시:
#include <stdio.h> int global_var; // 정의, 자동 초기화 = 0 static int static_global_var; // static 파일, 자동 초기화 = 0 extern int extern_var; // 선언, 정의는 다른 곳에 존재 void foo() { int local_var; // 자동, 초기화되지 않음 -> 쓰레기 static int static_local_var; // static, 자동으로 0으로 초기화 }
주요 특징:
1. 자동 변수 (static도 extern 없는 지역 변수)는 컴파일러에 의해 자동으로 0으로 초기화되는가?
아니요, 쓰레기를 포함합니다. 초기화 전까지 사용하는 것은 오류입니다.
2. 다른 파일에서 extern으로 변수를 여러 번 정의할 수 있는가?
아니요, 하나의 정의가 필요하며, 나머지는 extern을 통한 선언이어야 함, 그렇지 않으면 링커가 "multiple definition" 또는 "undefined symbol" 오류를 발생시킵니다.
3. 함수의 선언과 정의는 무엇이 다른가?
선언은 오직 프로토타입(본체 없음)이며; 정의는 반드시 함수의 본체를 포함합니다. 변수의 경우 extern을 통한 선언은 메모리를 예약하지 않으며, 함수의 경우 두 형태 모두 허용됨.
전역 변수 int counter;가 두 개의 헤더 파일에서 선언됨. 프로젝트가 multiple definition 오류로 링킹되었습니다.
장점:
단점:
헤더에 extern int counter;가 작성되어 있고, 정의는 int counter = 0; — 오직 하나의 C 파일에서만 이루어집니다.
장점:
단점: