[C++] 13. 분할구현

김김김🍅·2025년 9월 1일

C++공부로그

목록 보기
13/23
  • 함수 선언
    일반적으로 main 뒤에 함수를 선언할 수 없음!
    하지만 main 앞에 함수를 선언해놓고 그 세부항목은 main 뒤에 적을 수 있긴 함!
int g_i = 0;

void Test();       // 함수 선언!

int main()
{
  Test()
  return 0;
}


void Test()        // 세부 함수
{
  ++g_i;
}

분할 구현

1. 헤더 파일(.h) 생성

단! 헤더에 직접 구현은 안됨 중복정의가 발생할 수 도 있음

// 함수 선언만 한 것 (반환은 없음)
int Add(int a, int b); 

2. 소스 파일(.cpp)생성

#include "func.h" 을 통해 헤더파일 참조

#include "func.h"


int Add(int a, int b)
{
  return a + b;
}

3. main에서 호출

#include "func.h" 을 통해 헤더파일 참조

4. 결론

main에서 헤더 파일을 포함해 함수를 호출하면, 실행 시 전체 프로젝트에서 해당 함수의 실제 구현(소스파일)을 찾아 실행하며, 따라서 구현 함수는 반드시 프로젝트 내에 존재해야 한다.

5. 추가

다양한 함수를 구현할 수 있음


에러

  1. 헤더 파일 위치 에러
  • 방법1 : 컴파일 위치 설정
g++ -std=c++17 14분할구현.cpp -I"/Users/kimseorin/Desktop/C++/include" -o 14분할구현
  • 방법2 : include 폴더에 넣지말고 그냥 같은 위치에 파일 넣기
/Users/kimseorin/Desktop/C++/
│
├─ 14분할구현.cpp
├─ func.h
  1. 빌드에러
  • 현재폴더 구조
    /Users/kimseorin/Desktop/C++/
    ├─ 14/
    │ ├─ 14분할구현.cpp
    │ ├─ func.cpp
    │ └─ func.h

폴더 안에 모든 폴더가 컴파일 되어야함 그러기 위해서는 아래처럼 변경해야한다.

  • task.cpp 수정
    기존코드 실행되는 것 아래에 모든파일이 한번에 실행되는 task코드 추가
{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: clang++ 활성 파일 빌드",
      "command": "/usr/bin/clang++",
      "args": [
        "-fcolor-diagnostics",
        "-fansi-escape-codes",
        "-g",
        "${file}",   // 활성파일 하나만 빌드
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "디버거에서 생성된 작업입니다."
    },
    {
      "type": "cppbuild",
      "label": "C/C++: 모든 파일 빌드",
      "command": "/usr/bin/clang++",
      "args": [
        "-fcolor-diagnostics",
        "-fansi-escape-codes",
        "-g",
        "${fileDirname}/*.cpp", // 현재 폴더의 모든 .cpp 파일 빌드
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": ["$gcc"],
      "group": "build",
      "detail": "현재 폴더의 모든 소스(.cpp) 파일을 빌드합니다."
    }
  ],
  "version": "2.0.0"
}
  • 디버깅을 위한 launch.json도 수정
{
  "configurations": [
    {
      "name": "C/C++: 단일 파일 디버그",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "lldb",
      "preLaunchTask": "C/C++: clang++ 활성 파일 빌드"
    },
    {
      "name": "C/C++: 전체 프로젝트 디버그",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "lldb",
      "preLaunchTask": "C/C++: 모든 파일 빌드"
    }
  ],
  "version": "2.0.0"
}
  • 컴파일 실행
    • run code
      : 'Run Task' → 'C/C++: 모든 파일 빌드'

    • 디버깅
      : 'Start Debugging' → 'C/C++: 전체 파일 디버그'

  • 파일 전체 구조

에러
1. 컴파일에러 : 문법 오류, 타입 오류 등 코드 자체가 잘못되어 컴파일되지 않을 때 발생
2. LNK오류 : 컴파일은 성공했지만, 함수나 전역 변수 등 실제 정의가 없어 연결할 수 없을 때 발생
예: 헤더에는 선언만 있고 cpp에서 구현이 없는 경우

--
✅ 확인하기
Q1. main에서 Add를 호출하면 실행되는 흐름을 설명하시오.

profile
🍅 토마토와 AI를 좋아하는 김서린입니다! 🧑🏻‍💻👩🏻‍💻👨🏻‍💻 🍅

0개의 댓글