전처리기(Preprocessor)
원본파일 -> Preprocess -> Compile -> 목적파일 -> Link -> 실행파일
#에 관련된 부분은 컴파일하기 이전에 전처리기에 의해 처리된다.
예를 들어
#include <stdio.h>
라고 쓰면 stdio.h 파일을 원본파일에 포함시키는 역할을 하며,
#define PI 3.141592f
void main()
{
float fRadius;
scanf("%f", &fRadius);
float fAreaOfCircle = PI * fRadius * fRadius;
printf("Area of circle = %f\n", fAreaOfCircle);
}
라고 쓰면 전처리기에 의해서 아래와 같이 바뀐다.
float fAreaOfCircle = 3.141592f * fRadius * fRadius;
//---------------------------------------------
#define ERROR_TEST
#ifdef ERROR_TEST
printf("에러가 있습니다.");
#endif
//---------------------------------------------
#define ERROR_TEST
#ifndef ERROR_TEST
printf("에러가 있습니다.");
#endif
//---------------------------------------------
파일별 함수 모듈 만들기
--> 함께 실습 하기로 한다.
<방법1>
#include <stdio.h> |
void PrintMenu() { printf("===========\n"); printf("1. +\n"); printf("2. - \n"); printf("3. *\n"); printf("4. /\n"); printf("5. %%\n"); printf("6. x^y\n"); printf("0. 종료\n"); printf("===========\n"); } int Modulo(int iNum1, int iNum2) { return iNum1 % iNum2; } int Add(int iNum1, int iNum2) { return iNum1+iNum2; } int Subtract(int iNum1, int iNum2) { return iNum1-iNum2; } int Multiply(int iNum1, int iNum2) { return iNum1*iNum2; } float Divide(int iNum1, int iNum2) { if (0 == iNum2 ) { printf("0으로 나눌수 없습니다.\n"); return -1.0f; } return (float)iNum1/(float)iNum2; } int Pow(int iNum1, int iNum2) // x^y 2^3 == 2*2*2 { int iResult = 1; for (int i = 1; i <= iNum2; ++i) { iResult = iResult * iNum1; } return iResult; } |
void main() { .... } |
#include <stdio.h> |
#include "MyLib.h" |
void main() { .... } |
함수 부분은 MyLib.h라는 파일을 만들어
#include "MyLib.h" // MyLib.h 파일을 포함시킨다.
사용자가 만든 파일을 포함 시킬 때는 "" 기호를 쓰며,
컴파일러가 제공하는 파일을 포함 시킬 때는 <> 기호를 쓴다.
파일명 : MyLib.h
#ifndef _MYLIB_H_
#define _MYLIB_H_
void PrintMenu(){
printf("===========\n");
printf("1. +\n");
printf("2. - \n");
printf("3. *\n");
printf("4. /\n");
printf("5. %%\n");
printf("6. x^y\n");
printf("0. 종료\n");
printf("===========\n");
}
int Modulo(int iNum1, int iNum2)
{
return iNum1 % iNum2;
}
int Add(int iNum1, int iNum2) {
return iNum1+iNum2;
}
int Subtract(int iNum1, int iNum2) {
return iNum1-iNum2;
}
int Multiply(int iNum1, int iNum2) {
return iNum1*iNum2;
}
float Divide(int iNum1, int iNum2) {
if (0 == iNum2 )
{
printf("0으로 나눌수 없습니다.\n");
return -1.0f;
}
return (float)iNum1/(float)iNum2;
}
int Pow(int iNum1, int iNum2) // x^y 2^3 == 2*2*2
{
int iResult = 1;
for (int i = 1; i <= iNum2; ++i)
{
iResult = iResult * iNum1;
}
return iResult;
}
#endif
<방법2>
#include <stdio.h> | |
void PrintMenu(); int Add(int iNum1, int iNum2); int Subtract(int iNum1, int iNum2); int Multiply(int iNum1, int iNum2); float Divide(int iNum1, int iNum2); int Modulo(int iNum1, int iNum2); int Pow(int iNum1, int iNum2); | 헤더파일 -> MyLib.h
|
void main() { .... } |
|
void PrintMenu() { printf("===========\n"); printf("1. +\n"); printf("2. - \n"); printf("3. *\n"); printf("4. /\n"); printf("5. %%\n"); printf("6. x^y\n"); printf("0. 종료\n"); printf("===========\n"); } int Modulo(int iNum1, int iNum2) { return iNum1 % iNum2; } int Add(int iNum1, int iNum2) { return iNum1+iNum2; } int Subtract(int iNum1, int iNum2) { return iNum1-iNum2; } int Multiply(int iNum1, int iNum2) { return iNum1*iNum2; } float Divide(int iNum1, int iNum2) { if (0 == iNum2 ) { printf("0으로 나눌수 없습니다.\n"); return -1.0f; } return (float)iNum1/(float)iNum2; } int Pow(int iNum1, int iNum2) // x^y 2^3 == 2*2*2 { int iResult = 1; for (int i = 1; i <= iNum2; ++i) { iResult = iResult * iNum1; } return iResult; } | 소스파일 -> MyLib.cpp
|
#include <stdio.h> |
|
#include "MyLib.h" |
|
void main() { .... } |
|
파일명 : MyLib.h
#ifndef _MYLIB_H_
#define _MYLIB_H_
void PrintMenu();
int Modulo(int iNum1, int iNum2);
int Add(int iNum1, int iNum2);
int Subtract(int iNum1, int iNum2);
int Multiply(int iNum1, int iNum2);
float Divide(int iNum1, int iNum2);
int Pow(int iNum1, int iNum2);
#endif
파일명 : MyLib.cpp
#include "MyLib.h"
void PrintMenu(){
printf("===========\n");
printf("1. +\n");
printf("2. - \n");
printf("3. *\n");
printf("4. /\n");
printf("5. %%\n");
printf("6. x^y\n");
printf("0. 종료\n");
printf("===========\n");
}
int Modulo(int iNum1, int iNum2)
{
return iNum1 % iNum2;
}
int Add(int iNum1, int iNum2) {
return iNum1+iNum2;
}
int Subtract(int iNum1, int iNum2) {
return iNum1-iNum2;
}
int Multiply(int iNum1, int iNum2) {
return iNum1*iNum2;
}
float Divide(int iNum1, int iNum2) {
if (0 == iNum2 )
{
printf("0으로 나눌수 없습니다.\n");
return -1.0f;
}
return (float)iNum1/(float)iNum2;
}
int Pow(int iNum1, int iNum2) // x^y 2^3 == 2*2*2
{
int iResult = 1;
for (int i = 1; i <= iNum2; ++i)
{
iResult = iResult * iNum1;
}
return iResult;
}
<참조>
#ifndef _MYLIB_H_
#define _MYLIB_H_
void PrintMenu();
int Modulo(int iNum1, int iNum2);
int Add(int iNum1, int iNum2);
int Subtract(int iNum1, int iNum2);
int Multiply(int iNum1, int iNum2);
float Divide(int iNum1, int iNum2);
int Pow(int iNum1, int iNum2);
#endif
대신해서 아래와 같이 쓸 수도 있다. (MS Visual C++ 안에서만 가능, 비표준)
#pragma once
void PrintMenu();
int Modulo(int iNum1, int iNum2);
int Add(int iNum1, int iNum2);
int Subtract(int iNum1, int iNum2);
int Multiply(int iNum1, int iNum2);
float Divide(int iNum1, int iNum2);
int Pow(int iNum1, int iNum2);