스택큐힙리스트

외부가 정적 변수에 링크되지 않는 이유는 무엇인가요? 본문

카테고리 없음

외부가 정적 변수에 링크되지 않는 이유는 무엇인가요?

스택큐힙리스트 2023. 11. 18. 00:19
반응형

extern int n을 다른 파일에서 정의된 static int n으로 선언하면 컴파일되지 않는 이유는 무엇인가요? (이 두 선언은 파일 범위에서 이루어졌습니다.)


기본적으로 같은 범위에서 int nstatic int n은 왜 다른 것인가요? 이는 오직 extern과 관련이 있는 것인가요? 그렇다면, 제가 놓친 extern의 어떤 부분인가요?

답변 1


  1. int blah = 0; — blah는 이 파일에서 정의되며 다른 파일에서 접근할 수 있습니다. 다른 파일의 정의는 중복이 되며 오류를 발생시킵니다.

  2. extern int blah; — blah는 다른 곳에서 정의되어야 하며, 이 파일에서 참조됩니다.

  3. int blah; — 이것은 FORTRAN의 COMMON과 동등한 것입니다. 여러 파일에서 이와 같은 것을 여러 개 가질 수 있으며, 링커에 의해 하나의 공유된 int로 해결됩니다. (*)

  4. static int blah; (초기값과 함께 선택적으로) — 이것은 정적입니다. 이 파일에 완전히 비공개입니다. 다른 파일에서의 extern에는 보이지 않으며, 여러 개의 파일에서 모두 static TYPE blah;를 선언할 수 있으며, 이들은 모두 다릅니다.


오디언스 중 엄격한 사람들을 위해: '파일' = 컴파일 단위입니다.

함수 안에서(static으로 선언된 것이 아닌 파일 범위에서) static으로 선언된 것들은 더욱 좁은 범위로 적용됩니다. 즉, 같은 파일에서 두 함수가 static int bleh = 0;을 선언한다면, 그들은 연관성이 없습니다.


(*): 익숙하지 않은 사람들을 위해 설명하자면, 보통의 패턴에서 한 개의 컴파일 유닛은 전역 변수를 정의해야 하며, 다른 파일에서는 해당 변수를 참조할 수 있습니다. 이 변수는 해당 컴파일 유닛에서 지속됩니다. 위의 경우 (3)에서는 어떤 파일도(또는 모든 파일이) 변수를 정의하지 않습니다. 만약 두 파일에 int blah = 0;이라고 명시한다면, 링커는 다중 정의로 인해 오류를 발생시킵니다. 두 파일에 int blah;이라고 명시한다면, 링커는 기쁘게도 하나의 전역 int를 생성하고 모든 코드가 해당 변수를 참조하게 됩니다.

답변 2

외부에서 정적 변수에 링크를 걸 수 없는 이유
정적 변수는 프로그래밍 언어에서 전역에 정의되어 있는 변수로, 한 번 선언되면 프로그램이 종료될 때까지 메모리에 유지됩니다. 이러한 변수는 여러 함수에서 공유되어 사용되는 경우가 많으며, 프로그램의 특정 범위에서 계속해서 유지되어야 하는 값을 저장하는 데 사용됩니다.
하지만 외부에서 이러한 정적 변수에 링크를 걸 수 없는 이유는 다음과 같습니다.
1. 보안 및 데이터 접근의 제어:
정적 변수는 프로그램이 실행되는 동안 계속 유지되므로, 다른 모듈이나 프로세스에서 접근할 수 있으면 보안에 취약해질 수 있습니다. 따라서 개인 정보나 중요한 데이터와 같은 핵심 정보를 보호하기 위해 정적 변수에 대한 외부 접근을 제한하는 것이 중요합니다.
2. 네임스페이스 충돌:
정적 변수는 프로그램 전역에서 접근 가능하므로, 다른 모듈이나 파일에서 동일한 이름의 정적 변수를 정의할 경우 충돌이 발생할 수 있습니다. 이로 인해 의도치 않은 버그가 발생하거나 예상치 못한 동작을 초래할 수 있으므로, 외부에서의 접근을 제한함으로써 이러한 충돌을 방지할 수 있습니다.
3. 모듈 독립성 및 오류의 최소화:
프로그램이 여러 모듈로 구성되어 있을 경우, 각 모듈 간의 독립성이 필요합니다. 정적 변수에 대한 외부 접근은 모듈 간의 의존성을 증가시키고, 모듈의 재사용성과 유지 보수의 어려움을 초래할 수 있습니다. 또한 모듈 내에서만 사용되는 변수가 다른 모듈에서 접근되면 프로그램이 예기치 않게 동작할 수 있으며, 디버깅 및 오류 수정이 어려워집니다. 따라서 모듈 간의 독립성을 유지하기 위해 정적 변수에 대한 외부 접근을 제한하는 것이 필요합니다.
이러한 이유로 정적 변수에 대한 외부 접근을 제한하고, 캡슐화와 정보 은닉을 통해 프로그램의 보안성과 모듈 간의 독립성을 유지하는 것이 중요합니다. 외부에서 정적 변수에 접근할 필요가 있는 경우에는 간접적으로 전역 변수를 수정하는 함수를 사용하거나, 필요한 값을 함수의 매개 변수로 전달하는 등의 방법을 활용할 수 있습니다.
이렇게 외부에서 정적 변수에 대한 노출을 최소화함으로써, 프로그램의 안정성, 보안성, 모듈의 독립성을 높이고 오류를 최소화할 수 있습니다. 프로그래밍을 할 때는 항상 변수의 범위와 접근성을 고려하여 적절한 방식으로 변수를 사용하는 것이 중요합니다.

반응형
Comments