C언어 : 파일분할 예제

지환·2022년 2월 26일
0

C언어

목록 보기
36/37
post-thumbnail

출처 | 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;


}

<결과>

  • 이렇게 파일 분할을 하지 않으면 소스가 길어져 버린다.
  • 이제 이걸 파일 분할을 하여 3개의 파일로 쪼개보겠다(func.h와 func.c, 그리고 main.c)

<func.h>

#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);

<func.c>

#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);


}

main()

#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이상의 버전에서 지원함.

profile
아는만큼보인다.

0개의 댓글