개념 사전 · 언어

C 언어

C · 씨 언어

C는 자료형·포인터·함수와 명시적인 메모리 사용을 통해 프로그램을 표현하는 언어이다. 일반적인 도구 체인에서는 소스가 ·어셈블·링크를 거쳐 실행 파일이 되며 실행 시 메모리와 외부 자원 수명을 관리해야 한다.

밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.

01무엇이고, 어떤 일을 하나

  • 운영체제·라이브러리·시스템 프로그램의 저수준 인터페이스를 표현한다.
  • 함수와 자료 구조를 소스·헤더·로 나누어 구성한다.
  • 정수 폭·포인터·메모리 수명을 고려한 동작을 구현한다.

02어떤 순서로 동작하나

  1. 전처리

    include·매크로·조건부 지시문을 처리하여 컴파일할 소스를 준비한다.

  2. 컴파일·어셈블

    문법·타입을 해석해 기계 코드가 든 을 만든다.

  3. 링크

    다른 과 라이브러리의 심벌 정의를 결합하여 실행 산출물을 만든다.

  4. 적재·실행

    운영체제와 가 필요한 메모리 매핑·동적 연결·초기화를 수행한 뒤 프로그램이 실행된다.

03먼저 알아둘 용어와 구성요소

전처리기는 #include에 따라 헤더 내용을 포함하고 매크로와 조건부 컴파일 지시문을 처리한다. 이어 가 구문·타입 등을 분석하고 대상 기계의 코드로 내릴 표현을 만든다. GCC에서 -S는 어셈블리 출력을 남기고, 어셈블러는 이를 기계어와 심볼·재배치 정보가 들어 있는 로 만든다.
.s는 사람이 읽을 수 있는 어셈블리 텍스트이고, .o/.obj는 보통 바이너리 이다. 에는 아직 외부 함수의 최종 주소를 해결하지 못한 참조가 있을 수 있다. 확장자만 보지 말고 도구·파일 형식·대상 플랫폼까지 확인한다.
는 여러 과 라이브러리의 정의·참조를 맞추고 코드와 데이터를 실행 형식에 배치한다. 정적 링크에서는 필요한 라이브러리 코드를 결과물에 포함할 수 있고, 동적 링크에서는 공유 라이브러리에 대한 참조를 남겨 실행 환경에서 연결한다. “컴파일이 됐다”와 “링크가 됐다”는 서로 다른 성공 조건이다.
실행을 시작할 때 운영체제는 실행 파일을 확인하고 코드·데이터 등의 주소 공간 매핑을 준비한다. 동적 실행 파일에서는 동적 가 공유 라이브러리를 찾아 매핑하고 필요한 심볼 처리를 수행한다. 언어 런타임 초기화 뒤 사용자 코드에 도달한다. 전체 파일을 RAM에 한꺼번에 복사해야만 실행되는 것은 아니며, 실제 페이지 적재는 운영체제의 정책과 연결된다.
다른 파일에 정의된 함수·데이터를 참조하면 에는 심벌과 위치 보정 정보가 남을 수 있다. 링크 시 결합하거나 동적 적재 과정에서 필요한 주소를 연결한다.
함수 호출을 이어가기 위한 인수·반환 위치·지역 상태를 관리하는 구현상의 구조이다. C의 자동 저장 기간 객체와 malloc으로 할당한 객체의 수명은 다르며, 지역 변수 주소를 함수 밖에서 계속 사용하는 오류와 구분한다.

04예제로 따라가기

  • 함수 선언을 보고 한 소스를 로 만드는 데 성공해도 실제 정의가 링크 입력에 없으면 undefined reference 같은 링크 오류가 날 수 있다.
  • 소스의 int와 포인터의 바이트 크기는 언어 이름만으로 하나의 값에 고정하지 않고 구현·대상 ABI 조건을 따른다.
  • 이미 빌드된 파일도 대상 CPU·운영체제·동적 라이브러리 조건이 맞지 않으면 적재나 실행 단계에서 실패할 수 있다.

05혼동하기 쉬운 점과 확인 기준

  • 파일·행·진단 메시지와 실제 컴파일 옵션을 연결한다. 헤더 경로 문제, 구문·타입 오류를 실행 환경 문제와 섞지 않는다.
  • 미정의 심벌이면 필요한 객체·라이브러리 포함과 링크 순서를 본다. 중복 정의이면 같은 구현을 두 번 넣었는지 확인한다.
  • 표준 오류·종료 상태·신호·traceback을 보존한다. 호출 경로의 마지막 줄과 원인 지점이 항상 같은 위치인 것은 아니다.

06상세 노트 · 실습 자료

헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.

공식 문서 · 표준

기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.