c언어의 static과 extern의 정확한 동작에 대해서 질문드립니다.

C언어를 공부하는 중에 중괄호 블럭이 함수 내부에서 사용된다면
어떻게 동작할까 궁금하여 다음과 같은 코드를 작성해보았는데

int main() {
   {
      int b = 0;
   }

   b = 1;
}

clang 으로 컴파일을 시도했을 때 중괄호 블럭 밖에서 b가 제거된 것이 확인되었습니다.
(undeclared identifier ‘b’ 오류 출력)
그런데 static과 extern을 이용하여 다음과 같이 코드를 작성할 떄,

int main() {
   {
      static int b = 0;
      extern int c;
      c = 0;
   }

   b = 0;
   c = 0;
}

첫번째 코드와 동일하게 undeclared identifier 오류가 출력되었는데,
static과 extern이 블럭의 수명이 다한 후에도 유지된다는 알고있던 동작과는 달라
함수 내부에서 static 객체를 선언하여 함수 외부에서 사용하였을 때도
동일하게 선언되지 않은 식별자 오류가 출력되었습니다.

이러한 결과는 static과 extern에 대해 알고있던 동작과는 달라
static과 extern의 정확한 동작에 대해 질문드립니다.

안녕하세요.

블록이 수명이 다한다음에 사용할 수 있다는게 아닙니다.

static은 그 블록안에서 정적으로 작동하며, file scope라 외부에서 접근할수없고

extern은 외부 다른곳에 그 변수가 존재하므로 참조하라는 키워드입니다.

좋은 답변이 있어서 가져왔습니다.

https://www.quora.com/What-is-the-difference-between-extern-and-static-variables-in-C-programming

1 Like

아하, static과 extern이 그런 동작이었군요…
지금까지 블록이 수명이 다한 후에 사용할 수 있다는 것으로 알고있었습니다…
대답 감사합니다.