전처리기(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비트의 비트 필드 사용하는 게 훨씬 메모리 절약
'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 |