스택큐힙리스트

외부 변수를 함수 내에서 초기화하는 것이 오류를 발생하는 이유는 무엇인가요? 본문

카테고리 없음

외부 변수를 함수 내에서 초기화하는 것이 오류를 발생하는 이유는 무엇인가요?

스택큐힙리스트 2023. 11. 20. 15:26
반응형

이 코드는 정상적으로 컴파일됩니다:


extern int i = 10;
void test()
{
std::cout << 안녕하세요 << i << std::endl;
}

이 코드는 오류가 발생합니다:


void test()
{
extern int i = 10;
std::cout << 안녕하세요 << i << std::endl;
}


오류: 'i'는 'extern'과 초기화 값을 모두 가지고 있습니다



저는 이 내용을 C++ Primer에서 읽었습니다:



명시적 초기화 값을 포함하는 모든 선언은 정의입니다.
extern으로 정의된 변수에 초기화 값을 제공할 수 있지만
extern을 무시하고 초기화입니다. 초기화 값을 갖는 extern은 정의입니다. 함수 내부의 extern에 초기화 값을 제공하는 것은 오류입니다.


지역 함수에서 이 작업을하는 경우에는 왜 오류가 발생하는지 설명해 줄 수 있을까요? 전역 범위에서는 동일한 작업이 허용되는 이유가 무엇일까요?

답변 1

다음의 예제가 유효하다고 가정하면 출력이 무엇이 될까요?


#include <iostream>
using namespace std;
extern int i;
int i = 10;
void test()
{
std::cout << 안녕 << i << std::endl;
}
void test2() {
extern int i = 1000;
std::cout<< 안녕 << i << std::endl;
}
void test3() {
extern int i;
i = 1000;
std::cout<< 안녕 << i << std::endl;
}
int main()
{
extern int i;
i++;
test();
i = 0;
test2();
}

test2의 출력은 0이나 1000이 되어야합니까? 또한 test3에 대해서도 살펴보십시오. 여기에서는 외부에서 정의된 i와 링크하고 그 값에 1000을 할당하도록 간결하게 말합니다. 이는 값을 초기화하려는 것과 매우 다릅니다.

간단히 말해서 extern 변수는 전역변수로만 의미가 있으며 전역 영역에서 정의되어야 합니다. 예제에서 첫 번째 버전은 내 경우에는 컴파일되지 않습니다. 이것은 흥미로운 점입니다. 이것이 명확하게 정의되었는 지 표준 문서를 살펴보거나 컴파일러가 추가 보호 기능을 추가하기 위해 이를 처리하는 방식인 지 확인해볼 가치가 있을 수도 있습니다...

답변 2

외부 변수를 함수 내에서 초기화하려고 하면 왜 오류가 발생하는가?
C 언어에서는 외부 변수를 선언할 때 키워드 extern을 사용하여 해당 변수가 다른 파일에 정의되어 있다는 것을 알 수 있습니다. 그리고 일반적으로 프로그램의 다른 부분에서 이 변수에 접근할 수 있도록 하기 위해 전역 변수로 선언됩니다.
이러한 외부 변수를 함수 내에서 초기화하려고 시도하면 오류가 발생하는 이유는 다음과 같습니다.
첫째, 함수 내에서 선언된 변수는 해당 함수의 스코프(scope)에만 존재합니다. 함수가 끝날 때 이 변수는 파괴되므로, 함수 외부에서 이 변수에 접근하는 것은 불가능합니다. 따라서 외부 변수를 함수 내에서 초기화하면 해당 변수는 초기화 후에도 함수 내에서만 사용할 수 있게 됩니다.
둘째, 프로그램 실행 시, 초기화되지 않은 전역 변수와 초기화된 전역 변수 간의 순서는 중요합니다. 외부 변수는 프로그램이 시작되기 전에 초기화되며, 초기화 순서에 따라 값이 할당됩니다. 만약 함수 내에서 외부 변수를 초기화하면, 이 변수는 함수 호출 시 초기화되며, 프로그램에서 다른 부분에서 사용되기 전에 초기화가 이루어지므로, 정의된 값과 함수 호출 시 할당된 값이 다를 수 있습니다. 이는 예기치 않은 동작을 야기할 수 있으며, 디버깅과 유지보수에 어려움을 초래할 수 있습니다.
따라서 외부 변수를 초기화하기 위해서는 전역 변수로 선언하고, 함수 외부에서 초기화하는 것이 바람직합니다. 이로써 프로그램의 다른 부분에서 일관된 값을 가지며, 오류 없이 변수에 접근할 수 있게 됩니다.
이처럼 외부 변수를 함수 내에서 초기화하면 오류가 발생하는 이유를 알아봤습니다. 이러한 오류를 방지하기 위해서는 변수의 유효 범위와 초기화 순서에 대한 이해가 필요합니다. 정확한 변수 선언과 초기화 방식을 사용하여 오류 없이 프로그램을 작성할 수 있도록 노력해야 합니다.

반응형
Comments