Server/C++

함수 (Function)

Juzdalua 2024. 7. 20. 21:30

함수는 스택 메모리 영역을 사용한다.

시작: 함수1 -> 함수2 -> 함수3

종료: 함수3 -> 함수2 -> 함수1

함수가 종료되면 사용하던 스택 메모리에서 삭제된다.


코드는 절차대로 수행되므로 main함수 안의 사용할 함수는 사용하기 전에 위치해야 한다.

#include <stdio.h>

using namespace std;

int Add(int num1, int num2)
{
    return num1 + num2;
}

int main()
{
    int a = Add(1,2);
    printf("A: %d \n", a);

    return 0;
}

 

 

미리 선언만 하면 컴파일시 링크된다.

#include <iostream>
#include <stdio.h>

using namespace std;

int Add(int num1, int num2);

int main()
{
    int a = Add(1, 2);
    printf("A: %d \n", a);

    return 0;
}

int Add(int num1, int num2)
{
    return num1 + num2;
}

 

분할 컴파일

각 파일을 컴파일 -> 프로그램 빌드(링크)

프로그램을 빌드하는 과정에서 컴파일된 파일들의 변수, 함수 등을 링크하는 단계가 존재한다.

 

VSCode에서 헤더와 함수를 다른 cpp 파일로 생성하면 컴파일시 에러가 발생한다.

이를 수정하기 위해 tasks.json 파일을 수정한다.

주석처리된 ${file} ->${fileDirname}/*.cpp 수정

// .vscode/tasks.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "C:/msys64/ucrt64/bin/g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                // "${file}",
                "${fileDirname}/*.cpp",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:/msys64/ucrt64/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}
// func.h

#pragma once

namespace func
{
    int Add(int num1, int num2);
}
// func.cpp

#include "func.h"

namespace func
{
    int Add(int num1, int num2)
    {
        return num1 + num2;
    }
}
#include <stdio.h>
#include "func.h"

using namespace std;

int main()
{
    int a = func::Add(1, 2);
    printf("A: %d \n", a);

    return 0;
}

- 헤더에 선언만 하고 새로운 파일에 함수의 내용을 작성하는 이유

#include 전처리기를 사용하여 헤더를 가져오는 것은 복사 붙여넣기와 같은 의미이다.

즉 헤더에 함수의 내용까지 명시해버리면 해당 함수를 사용하지 않는 부분에서도 함수를 정의하게 된다.


간단한 재귀함수 예제

#include <stdio.h>

using namespace std;

int Factorial(int num)
{
    if (num == 1)
        return 1;
    return num * Factorial(num - 1);
}

int main()
{
    int a = Factorial(3);
    printf("A: %d \n", a);
    return 0;
}

 

피보나치수열

1 1 2 3 5 8 13 21 34 55 ...

#include <stdio.h>

using namespace std;

int Fibonacci_loop(int num)
{
    if (num == 1 || num == 2)
        return 1;

    int prev = 1;
    int next = 1;
    int result = 0;
    for (int i = 0; i < num - 2; i++)
    {
        result = prev + next;
        prev = next;
        next = result;
    }

    return result;
}

int Fibonacci_re(int num)
{
    if (num == 1 || num == 2)
        return 1;
    return Fibonacci_re(num - 1) + Fibonacci_re(num - 2);
}

int main()
{
    int a = Fibonacci_loop(5);
    printf("A: %d \n", a);

    int b = Fibonacci_re(5);
    printf("B: %d \n", b);

    return 0;
}