반응형
Notice
Link
스택큐힙리스트
왜 "extern const int n;"은 예상대로 작동하지 않을까요? 본문
반응형
내 프로젝트는 두 개의 소스 파일로 이루어져 있습니다:
a.cpp:
const int n = 8;
b.cpp:
extern const int n;
int main()
{
// error LNK2001: unresolved external symbol int const n (?n@@3HB)
int m = n;
}
나는 이것을 작동시키기 위한 몇 가지 방법들이 있는 것을 알고 있습니다; 그러나, 왜 작동하지 않는지 궁금합니다?
답변 1
이것은 const
가 기본적으로 내부 연결을 의미하는 것 이기 때문입니다. 그래서 정의는 번역 단위 외부에서는 보이지 않습니다.
이 경우, by far the best solution은 헤더 파일에 선언 (extern int const n;
)을 넣고, 그것을 a.cpp
및 b.cpp
에 포함시키는 것입니다. 연결은 컴파일러가 처음으로보는 선언에 의해 결정되므로, a.cpp
에서의 나중의 정의는 올바른 (외부) 연결을 갖게 될 것입니다.
또는 정의에서 연결을 강제 할 수도 있습니다:
extern int const n = 8;
extern
이 있음에도 불구하고, 이것은 여전히 정의입니다; 클래스 정의 외부의 초기화를 가진 모든 것은 정의입니다.
답변 2
제목: 외부 링크된 상수를 선언할 때 extern const int n;은 왜 예상대로 동작하지 않을까요?서론:
컴퓨터 프로그래밍은 사용자가 동작을 예측하고 의도한 대로 결과를 얻을 수 있도록 코드를 작성하는 과정입니다. 하지만 때로는 예상했던 대로 동작하지 않는 상황이 발생할 수 있습니다. 이번 에세이에서는 extern const int n;이 왜 예상대로 동작하지 않을 수 있는지에 대해 알아보고자 합니다. 이에 대한 이유에 대해 살펴보겠습니다.
본론:
1. 선언과 정의의 차이:
extern const int n;은 외부에 있는 변수의 선언을 의미합니다. 이 선언은 변수의 정의가 따로 존재한다고 가정하고 해당 변수에 대한 정보를 컴파일러에게 제공합니다. 그러나 extern const int n;은 변수를 정의하지 않고 선언만 한 것이기 때문에 초기화되지 않은 변수를 참조하고자 할 때 문제가 발생할 수 있습니다.
2. 초기화의 필요성:
extern const int n;을 사용할 경우, 외부에 위치한 변수를 초기화하지 않고 사용하게 됩니다. 일반적인 변수는 초기화하지 않으면 컴파일러가 기본값으로 초기화하지만, 상수(const)의 경우에는 반드시 초기화가 필요합니다. 초기화되지 않은 상수(const)를 참조하게 되면, 예기치 않은 동작이 발생할 수 있습니다.
3. 링크 에러:
외부에 위치한 변수를 선언했지만 초기화하지 않으므로 사용 시 링크 에러가 발생할 수 있습니다. 링크 에러는 프로그램을 실행하기 전에 발생하는 오류로, 해당 변수가 외부에 정의되지 않았을 때 발생합니다. 이는 프로그램의 실행에 실패할 수 있으며 원인을 찾아 수정해야 합니다.
4. 상수의 값 변경 불가:
extern const int n;을 사용하면 해당 변수를 다른 곳에서 수정할 수 없게 됩니다. 선언한 상수 변수를 수정하려고 하면 컴파일 오류가 발생합니다. 이는 상수의 특성에 맞지 않는 동작으로, 개발자의 예상과 다르게 동작하게 됩니다. 만약 다른 모듈에서 이 변수를 변경하기를 원한다면, 해당 변수를 변경 가능한 변수로 선언하고 초기화해야 합니다.
결론:
extern const int n;을 사용할 때는 변수의 선언과 초기화에 주의해야 합니다. 초기화되지 않거나 외부에 정의된 변수를 잘못 참조하는 경우 예상치 못한 결과를 얻을 수 있습니다. 따라서 변수의 선언과 초기화를 명확하게 작성하고, 변수의 특성에 맞는 방식으로 사용해야만 원하는 결과를 얻을 수 있습니다. 프로그래밍에서의 세심한 주의와 검토는 예상치 못한 오류와 문제를 최소화하여 더 안정적이고 신뢰성 있는 코드를 작성할 수 있도록 도움을 줄 것입니다.
반응형
Comments