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;
}