출처 | https://eskeptor.tistory.com/25?category=928922
이번 시간에는 파일분할에 대해서 알아보겠다.
파일 분할에 대해 알기 전 전처리기에 관련된 얘기를 인지하고 있어야 한다.
전처리기란
선행처리기라고도 불린다.(영어로는 Pre-Compiler 또는 Pre-Process라고 한다.)
C언어에서 "#"으로 시작되는 것들을 전처리기 명령문이라고 한다.
이 컴파일 과정을 숙지해야된다.
#include 에 대해 알아보자.
#include "<>"는 <>안에 있는 파일에서 기능을 사용하기 위해 프로그램에 포함시킨다.
<>를 사용하는 경우 IDE에 포함되었거나 나중에 IDE에 추가한 레퍼런스 헤더파일을 포함시킬 때 사용한다.
" "를 사용하는 경우 현재 편집하고 있는 프로젝트에 포함되어 있는 헤더파일이나 파일을 포함시킬 때 사용한다.
1. 전처리기란?
2. #include<>와 #include ""
3. #define의 2가지
4. #if ~ #elif ~ #else ~ #endif
5. #ifdef와 #ifndef의 차이점
6. #연산자와 ##연산자
나머지 전처리기에 대한 설명은 밑 링크를 참고해라.
출처: https://eskeptor.tistory.com/24 [Hello World]
#include <stdio.h>
typedef struct
{
int num1, num2;
int add;
int min;
int mul;
int div;
}Result;
void Calc(Result* res)
{
res->add = res->num1 + res->num2;
res->min = res->num1 - res->num2;
res->mul = res->num1 * res->num2;
res->div = res->num1 / res->num2;
}
void Print_res(Result* res, int sel)
{
switch (sel){
case 1:
printf("결과 : %d\n", res->add);
break;
case 2:
printf("결과 : %d\n", res->min);
break;
case 3:
printf("결과 : %d\n", res->mul);
break;
case 4:
printf("결과 : %d\n", res->div);
break;
default:
printf("잘못된 입력\n");
break;
}
}
void input(Result* res)
{
printf("첫번째 입력 : ");
scanf_s("%d", &res->num1);
printf("두번째 입력 : ");
scanf_s("%d", &res->num2);
}
int main()
{
Result res;
int sel;
printf("==계산 프로그램==\n");
input(&res);
Calc(&res);
printf("연산선택 (1, 덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈)\n");
printf("선택 : ");
scanf_s("%d", &sel);
Print_res(&res, sel);
return 0;
}
#pragma once
#include <stdio.h>
typedef struct
{
int num1, num2;
int add;
int min;
int mul;
int div;
}Result;
void Calc(Result* res);
void Print_res(Result* res, int sel);
void Input(Result* res);
#include "func.h"
void Calc(Result* res)
{
res->add = res->num1 + res->num2;
res->min = res->num1 - res->num2;
res->mul = res->num1 * res->num2;
res->div = res->num1 / res->num2;
}
void Print_res(Result* res, int sel)
{
switch (sel) {
case 1:
printf("결과 : %d\n", res->add);
break;
case 2:
printf("결과 : %d\n", res->min);
break;
case 3:
printf("결과 : %d\n", res->mul);
break;
case 4:
printf("결과 : %d\n", res->div);
break;
default:
printf("잘못된 입력\n");
break;
}
}
void input(Result* res)
{
printf("첫번째 입력 : ");
scanf_s("%d", &res->num1);
printf("두번째 입력 : ");
scanf_s("%d", &res->num2);
}
#include "func.h"
int main()
{
Result res;
int sel;
printf("==계산 프로그램==\n");
input(&res);
Calc(&res);
printf("연산선택 (1, 덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈)\n");
printf("선택 : ");
scanf_s("%d", &sel);
Print_res(&res, sel);
return 0;
}
순서는 이와같이 진행된다.
결과는 동일하게 산출된다.
헤더파일과 관련된 사소하지만 중요한 부분이 있다.
#pragma once와 #ifndef
"파일 분할"을 하여 헤더파일을 include하는 과정에서 오류가 발생할 수 있습니다. 바로 "헤더파일 중복 오류"다.
이것을 예방할 수 있는 방법은
1."#ifndef"를 사용하는 방법
2."#pragma once"를 사용하는 방법
<#ifndef 사용법>
[대표적으로 사용하는 이름 규칙]
1) 언더바2개 + 헤더파일이름(대문자) + 언더바 + H + 언더바
= __FUNC_H_
2) 언더바 + 헤더파일이름(대문자) + 언더바 + H + 언더바
= _FUNC_H_
3) 헤더파일이름(대문자) + 언더바 + H
= FUNC_H
<"#pragma once" 사용법>
// Func.h 파일
#pragma once
// 내용 작성...
#pragma once 는 모든 환경에서 사용할 수 없다
최신의 GCC, 또는 Visual Studio 2010이상의 버전에서 지원함.