c의 링킹, 헤더, 전역변수 extern static

markyang92·2023년 2월 19일
0

C

목록 보기
7/7
post-thumbnail

C의 빌드 4단계

  1. 전처리
  2. 컴파일
  3. 어셈블
    여기서 .o 파일 생성
  4. 링크

헤더파일

  • 함수 선언
    • 원형을 알아야 사용할 수 있기 때문
  • 매크로
  • extern 변수 선언 등

include <>, " "

  • 디스크 상의 어디에서 찾느냐?
  • < >는 시스템 경로에서만 헤더 파일을 검색
    • 보통 컴파일러가 제공하는 시스템 헤더 파일을 인클루드 할 때 사용
  • " " 는 기본적으로 워킹 디렉토리에서 헤더 파일을 검색한 뒤 시스템 경로를 검색

오브젝트 코드

  • build의 어셈블 이후 생성되는 파일
  • 오브젝트 코드는 기계가 곧바로 이해 가능한 기계코드이다.

링크

  • 링커가 링크를 수행한다.
  • 입력이 모든 오브젝트 코드들을 합쳐서 하나로 만들어준다.
  • .o 파일을 보면, 레이블이 있는데 이 레이블이 어디에 있는지 메꿔준다.

dynamic link

dynamic library여기 참고

  • 실행파일은 여전히 구멍을(레이블)을 남겨둠
  • 실행파일을 실행할 때 실제로 링킹이 일어남
    • 이 링킹은 실행 중에, 운영체제가 해줌
  • 여러 실행파일이 동일한 라이브러리 공유 -> '메모리 절약'

파일 범위 변수(전역 변수)

  • 전역변수
    • 다른 소스코드 파일에서 링크 가능
    • 프로그램 실행 동안 공간 차지
      • 스택(x)
      • 데이터 섹션에 들어감
      • 미리 컴파일될 때 어디에 들어갈 줄 앎

다른 파일의 전역변수 사용하기

  • 다른 파일의 전역변수는 잘 모른다.

  • 그렇다고 똑같은 이름의 전역변수 쓰면 안된다(함수도 그렇잖아)

그래서 사용하는 것이 extern


extern

  • 헤더extern 키워드 쓰고 전역변수 써두면,
    해당 헤더include하는 어떠한 .c파일에서 선언하면 됨.

  • extern 키워드를 빼먹으면, 링커 오류

올바른 extern 사용법

  1. 남의 라이브러리.c 파일을 볼 수 없음
    라이브러리 바이너리, header 만 줌
    이 경우, 제작자가 externheader에 줌

함수는 extern 안붙임

  • 함수는 그냥 선언하면 자동으로 extern

전역변수의 문제 -> static!

  • 확실히 문제가 있음
    • extern을 사용하면, 아무데서나 확인가능하고, 심지어는 내 파일 안의 변수를 바꿔버림
  • 다른 놈이 내 전역 변수를 못쓰게 하자!
  • 내 파일 안에서만 전역 변수를 사용


static 지역 변수

  • 어찌됬건 static 을 두면, 지역변수 범위내 전역화!

static 함수

  • 파일 내에서만 사용


  • 위 파일을 고쳐 약간 getter, setter 처럼 사용해보자.

profile
pllpokko@alumni.kaist.ac.kr

1개의 댓글

comment-user-thumbnail
2023년 11월 3일

정리를 너무 잘해주셔서 잘 읽었습니다. 감사합니다.

답글 달기