전처리기(preprocessor)는 프로그램을 컴파일할 때 컴파일 직전에 실행되는 것으로, 전처리기가 실행되면 각 코드 파일에서 #으로 시작하는 지시자(directives)를 찾는다.
#include
지정된 파일을 그 위치에 복사, 파일을 포함시키기 위해 사용한다. Current directory 에서 먼저 찾고 그 다음 표준 라이브러리에서 찾음
// 표준 라이브러리
#include <filename>
// 사용자가 정의한 파일
#include "filename"
#define
심볼릭 상수나 매크로를 생성할 때 사용. 컴파일 시 텍스트로 대체됨. 매크로 사용의 장점은 코딩 오버헤드를 줄여줌.
#define PI 3.141592
#define CIRCLE_AREA( x ) ( (PI) * ( x ) * ( x ) )
#define RECTANGLE_AREA( x, y ) ( ( x ) * ( y ) )
rectArea = RECTANGLE_AREA( a + 4, b + 7 );
#undef
심볼릭 상수나 매크로를 생성한 것을 해제할 때 사용
조건부 컴파일
#if !defined( NULL )
#define NULL 0
#endif
모든 #if 는 #endif로 끝남
#ifdef 는 #if defined 의 줄임 표현
#ifndef 는 #if !defined 의 줄임 표현
#elif 와 #else 사용 예시
#if defined(STM32F4XX)
// do something …
#elif defined(ESP32)
// do something …
#else
// do something …
#endif
컴파일 할 때 제외하고 싶은 코드가 있을 때 아래와 같이 사용
#if 0
code commented out
#endif
#define DEBUG 1
#if (DEBUG==1)
printf (“ Variable x = %d \n”, x) ;
#endif
#define DEBUG
#if defined(DEBUG)
printf (“ Variable x = %d \n”, x) ;
#endif
assert 매크로
#include <assert.h> // assert가 정의된 헤더 파일 포함
assert(src != NULL); // src가 NULL이면 프로그램 중단
assert(num > 0); // num이 양의 정수가 아니면 프로그램 중단
만약 NDEBUG 가 #define 되어 있다면 모든 assert 매크로가 무시된다.
#define NDEBUG
✓ assert 용어
HW 문서에서 사용되는 assert는 신호의 극성(Active-High / Active-Low)과 무관하게, 신호가 inactive 상태에서 active 상태로 전이되는 것을 의미한다. 반대로 신호가 active 상태에서 inactive 상태로 전이되는 것은 deassert라고 한다.
한편, SW에서 사용하는 assert() 함수는 특정 조건이 반드시 참이어야 함을 단언하기 위한 디버깅용 함수로 해당 조건이 거짓일 경우 프로그램 중단, 에러 로그 출력 등의 동작을 수행한다.
'프로그래밍 > C' 카테고리의 다른 글
| C ] memset 함수 구현 (0) | 2022.10.09 |
|---|---|
| C ] 명령 프롬프트 구현 (함수포인터 사용) (0) | 2022.08.25 |
| C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 (0) | 2022.08.12 |
| [ Visual Studio ] CRT 라이브러리로 메모리 누수 탐지하기 (0) | 2022.05.02 |
| [ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? (0) | 2022.05.02 |