본문 바로가기
ProgrammingLanguage/C언어

C언어 | 헤더파일 예제, #ifndef, #pragma once

by 씽쌩쏭 2021. 2. 19.
728x90

✅ 오늘의 문제 : 사칙연산

 

사칙연산이 가능한 함수 (더하기, 빼기, 곱하기, 나누기) 가 정의되어 있는 "calc.h" 헤더파일을 만들어서 사용해 보세요

 

(코뮤니티 모각코 과정 中 출제되어 푼 문제입니다.)

 

 


헤더파일이란?

 

앞서 예제들에서 사용했던

#include <stdio.h>

에서 stdio.h도 헤더파일!

 

왜 사용하나?

 

C언어는 절차지향적 언어임

그렇다보니 함수를 사용할 때 매우 불편...

main 함수를 맨 밑으로 내리면

프로그램에 대한 전체적인 구조 파악이 힘듦

선언부만 앞으로 떼어내어 함수가 코드 내 존재한다고 알려줄 수도 있지만

함수의 개수가 많아지게되면...🤦‍♀️

 

이런 문제점을 해결하기위해 헤더파일 사용!

헤더파일 = "선언부"들을 모아둔 파일이라고 생각

(예제를 보면서 이해하시길...!)

 


#pragma once

 

VS2019 환경에서 새로운 헤더파일을 생성 시

자동으로 입력되는 전처리기!

 

어떠한 코드나 헤더파일이 다른 코드나 헤더에서 include 될때,

중복되어 복사되는 것을 방지하는 기능!!

 

#include는 컴파일 시점에, 해당 파일 내의 코드를

내 코드 안에 '붙여넣기'하는 전처리기임

 

근데!! 예를 들어 내가 stdio.h 헤더 파일을 2번 include 하면?

(멍청한 실수라고 생각할 수 있지만...

내가 main.c 안에 stdio.h를 include하고

누가 제공해준 test.h 를 include 했는데

test.h의 코드인 test.c 코드 안에 stdio.h가 include 되어 있다면

중복되는 일이 발생할 수 있음!)

 

그럼 심각한 충돌이 일어날 수 있기 때문에,

이를 방지하고,

"해당 파일을 두 번 읽지 않겠다."는 뜻으로

#pragma once 라는 전처리기를 사용함!!

 

//Pragma 전처리기는 Visual Studio 종속적인 키워드라

다른 IDE에서는 기능하지 X

 

 

#ifndef

 

그렇기 때문에,

보다 보편적인 코드를 만들고 싶다면

#ifndef ____

#define ____

.

.

.

#endif

 

를 사용한다!

 


문제 풀이

 

// main.c

#define _CRT_SECURE_NO_WARNINGS
#include "calc.h"


int main() {

	int a, b;

	scanf("%d", &a);
	scanf("%d", &b);

	calculus(a, b);

	return 0;
}
// calc.h
#ifndef CALC

#define CALC
#include <stdio.h>

void calculus(int a, int b);

#endif // !CALC
// calc.c
#include "calc.h"

void calculus(int a, int b) {
	printf("%d + %d = %d\n", a, b, a + b);
	printf("%d - %d = %d\n", a, b, a - b);
	printf("%d * %d = %d\n", a, b, a * b);
	printf("%d / %d = %d\n", a, b, a / b);
}

 

출력 시