문제의 역사:
글로벌 변수와 로컬 변수는 C에서 메모리 관리 및 코드 가시성을 위해 도입되었습니다. 글로벌 변수는 모듈 프로그래밍이 등장하기 전 함수 간 데이터 교환의 주요 방법이었으며, 로컬 변수는 상호작용을 줄이고 코드의 격리를 향상시켰습니다.
문제:
글로벌 변수와 로컬 변수 간의 차이, 즉 수명, 가시성, 초기화 규칙과 시간에 대한 오해가 자주 발생합니다. 글로벌 변수는 동기화 문제와 가독성 문제를 초래하고, 로컬 변수는 필요한 데이터에 접근할 수 없게 만듭니다. 이러한 차이에 대한 오해는 버그를 초래하고 코드 확장을 어렵게 만듭니다.
해결책:
글로벌 변수는 모든 함수 외부에서 선언되며 extern을 사용하여 모든 파일에서 접근할 수 있습니다. 그 수명은 전체 프로그램이며 초기화는 정적 변수의 경우 암묵적으로 0으로, 또는 사용자 값으로 명시적으로 수행됩니다. 로컬 변수는 함수 내에서 선언되며, 그 수명은 함수 호출로 제한되며 자동으로 초기화되지 않습니다.
코드 예:
int g_var = 42; // 글로벌 변수 void foo() { int l_var = 5; // 로컬 변수 }
주요 특징:
로컬 변수가 초기값이 지정되지 않으면 자동으로 0으로 초기화됩니까?
아니요. 글로벌 변수와 정적 변수만 기본적으로 0으로 초기화됩니다. 로컬 변수는 명시적으로 초기값을 지정하지 않으면 '쓰레기' 값(정의되지 않은 값)을 포함합니다.
예:
void test() { int a; printf("%d ", a); // 정의되지 않은 동작 }
다른 파일에서 항상 글로벌 변수에 접근할 수 있습니까?
아니요. 변수가 함수 외부에서 static으로 선언되면 그 소스 파일 내에서만 볼 수 있습니다. 글로벌 가시성이 필요하면 extern을 사용하십시오.
함수 내에서 글로벌 변수를 선언할 수 있습니까?
아니요. 함수 내에서는 모든 선언이 로컬입니다. 글로벌 변수는 함수 외부에서만 생성할 수 있습니다.
글로벌 변수를 사용하여 함수 간 데이터를 교환:
int error_code; void f1() { error_code = 1; } void f2() { if (error_code) ... }
장점:
단점:
모든 변수가 로컬이며, 데이터는 함수 매개변수를 통해 전달:
void f1(int *err) { *err = 1; } void f2(int err) { if (err) ... }
장점:
단점: