본문 바로가기
Programming/C

16. 전처리 및 다중 소스 파일

by 기딩 2023. 10. 19.
728x90

전처리기(preprocessor)

 컴파일에 앞서 소스파일을 처리하는 컴파일러의 한 부분

 소스파일 → C컴파일러(전처리기→컴파일러) → 오브젝트파일

 

지시어 / 의미

#define 매크로 정의

#include 파일 포함(헤더파일 복사해옴)

 

#line 행번호 출력

#pragma 시스템마다 의미 다름

 

단순 매크로

 + 프로그램 가독성 높임

 + 상수 바꾸기 쉬움 ex) #define PI 3.141592

 

함수 매크로 function-like macro

ex) #define SQUARE(x) ((x)*(x))

괄호로 둘러싸는 것이 좋음

 

+ 함수 호출단계가 필요x → 실행속도 빠름 

- 소스 코드 길이 길어짐

 

 

간단한 기능은 매크로 사용

#define MIN(x,y) ((x)<(y) ? (x) : (y))

한 줄 이상 연장하려면 \

 

# 연산자 

PRINT(x)처럼 호출하면 x=5 같이 출력하는 매크로

(문자열 변환 연산자) : 매크로 호출로 전달되는 실제 인수는 큰따옴표로 감싸지고 문자열로 변환됨

 

 

내장 매크로

미리 정의된 매크로

DATE : 현재 날짜 (월 일 년)로 치환됨

TIME : 현재 시간(시:분:초)로 치환

LINE : 소스파일에서의 현재 라인 번호로 치환

FILE : 소스 파일 이름으로 치환

 

ASSERT 매크로

#include <stdio.h>

//문제가 없는지 체크
#define ASSERT(exp) 	{ if (!(exp)) \\
	{ printf("가정("#exp")이 소스 파일 %s %d번째 줄에서 실패.\\n"\\
	,__FILE__, __LINE__), exit(1);}}

int main(void)
{
	int sum = 100;		// 지역 변수의 초기값은 0이 아님

	ASSERT(sum == 0);	// sum의 값은 0이 되어야 함.
	return 0;
}

 

비트 관련 매크로

변수를 받아서 특정 비트값을 반환하거나 설정

(일반적으로 하드웨어는 비트 통해서 제어)

#include <stdio.h>

#define GET_BIT(w, k) (((w) >> (k)) & 0x01)
#define SET_BIT_ON(w, k) ((w) |= (0x01 << (k)))
#define SET_BIT_OFF(w, k) ((w) &= ~(0x01 << (k)))

int main(void)
{
	int data = 0;
	SET_BIT_ON(data, 2);
	printf("%08X\\n", data);
	printf("%d\\n", GET_BIT(data, 2));

	SET_BIT_OFF(data, 2);
	printf("%08X\\n", data);
	printf("%d\\n", GET_BIT(data, 2));
	return 0;
}

 

#ifdef 

조건부 컴파일

 #ifdef DEBUG //if와 #endif 사이의 모든 문장들을 컴파일 함
          printf(”value=%d\\n”, value);
#endif

#ifdef 매크로가 정의되어 있는 경우

#endif 조건 처리 문장 종료

#ifndef 매크로가 정의되지 않은 경우

#undef 매크로 정의 취소

//중복 방지
#ifndef __MAIN_H_ //이전에 정의되지 않았으면 정의해줌
#define __MAIN_H_  //만약 이전에 정의됐으면 중복되어, 조건이 거짓이됨 
								//-> 헤더 파일의 내용이 2번 이상 포함 안 됨

~실제 코딩~

#endif //_MAIN_H_

#if 조건이 참이면 #endif 사이의 문장들을 컴파일

#else 그 외 컴파일

조건은 상수여야 함 ← 논리, 관계 연산자 사용 가능

 

다중 소스 파일

단일 소스 파일

- 파일 크기 너무 커짐

- 소스 파일 다시 사용하기 어려움

 

다중 소스 파일

- 서로 관련된 코드만 모아서, 한 소스 파일로 가능

- 소스 파일을 재사용 간편

//다중 소스 파일 multiple_source.c
//power() 호출
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "power.h"

int main(void)
{
	int x, y;

	printf("x의 값을 입력하시오:");
	scanf("%d", &x);
	printf("y의 값을 입력하시오:");
	scanf("%d", &y);
	printf("%d의 %d 제곱값은 %f\\n", x, y, power(x, y));

	return 0;
}
//power.c에 대한 헤더 파일 power.h

#ifndef POWER_H
#define POWER_H

double power(int x, int y);
#endif
//다중 소스 파일 power.c
//거듭 제곱하는 함수
#include "power.h"
double power(int x, int y)
{
	double result = 1.0;
	int i;

	for (i = 0; i < y; i++)
		result *= x;

	return result;
}
  • 다중 소스 파일에서 외부 변수
    외부 소수 파일에 선언된 변수 사용하려면 extern

 

비트 필드 구조체

멤버가 비트 단위로 나눠져 있는 구조체

struct product{ 
    unsigned style : 3; //콜론이면 비트 필드 
    unsigned size : 2; //2 bit 
    unsigned color : 1; //1 bit 
};

 

+ 메모리 절약

+ ON / OFF만 가지는 변수 저장 시 32비트 int쓰는 것보다 1비트의 비트 필드 사용하는 게 훨씬 메모리 절약

 

728x90

'Programming > C' 카테고리의 다른 글

[C] 간단한 MP3 플레이어 제작  (1) 2024.01.10
[C언어] 17. 동적메모리와 연결리스트  (0) 2023.10.19
15. 스트림과 파일 입출력  (1) 2023.10.19
13. 구조체  (0) 2023.10.19
12. 문자열  (0) 2023.10.19