[C언어] 전처리
전처리 지시사
전처리 지시사 : 컴파일 전 컴파일 환경에 맞게 소스 코드를 편집함
#include 지시사
#include는 지정 파일(텍스트 파일)을 소스 코드에 포함시킴
구조 : #include <stdio.h>
꺾쇠괄호(<>) : 컴파일러가 제공하는 헤더 파일(include 디렉터리 내 헤더 파일)을 불러옴
큰따옴표("") : 사용자가 만든 헤더 파일을 불러옴. #include "student.h"
해당 파일이 없는 경우 include 디렉터리에서 찾음
다른 디렉터리 파일 포함가능 ec. #include "C:\user\mydr.h"
* 백슬래시(\): 전처리 지시사는 컴파일러 처리 X(백슬래시를 제어 문자로 사용 X) 따라서 한 번만 사용
여러 모듈 사용하는 변수를 헤더파일로 저장 시 손쉬운 코딩 가능
*모듈,module : 독립적으로 컴파일 가능한 파일 단위
#define 지시사
#define 은 매크로명(대문자)을 정의함
매크로 상수
구조 : #define 매크로명 치환될_부분 ec. #define PI 3.14159
의미 있는 단어만을 사용
치환될 부분이 긴 경우 백글래시로 여러 줄 연결
매크로 함수
구조 : #define 매크로_함수명(인수) 치환될_부분 ec. #define SUM(a, b) ((a) + (b))
부작용을 줄이기 위해 모든 인수에 괄호 사용
정의된 매크로
이미 정의된 매크로 | 기능 |
__FILE__ | 전체 디렉터리 경로를 포함한 파일명 |
__FUNCTION__ | 매크로명이 사용된 함수 이름 |
__LINE__ | 매크로명이 사용된 행 번호 |
__DATE__ | 컴파일이 시작한 날짜 |
__TIME__ | 컴파일이 시작한 시간 |
#Line 지시사
매크로명 __LINE__ 의 파일명과 행 번호를 바꿈
구조 : #Line 100 "macro.c" // 다음 행부터 행 번호 100 , 파일 이름 macro.c로 설정
프로그램 실행 중 갑작스러운 종료 경우 함수명이나 행 번호 출력을 통해 진행영역 파악가능
매크로 연산자 #, ##
# 는 인수를 문자열로 치환
ec. #define PRINT(x) printf(#x " = %d\n", x)
PRINT(10 + 20); //printf("10 + 20" " = %d\n", 10 + 20);
결과 : 10 + 20 = 30
## 는 두 개의 토큰,token을 붙여서 하나로 치환
ec. #define NAME_CAT(a, b) (a ## b)
NAME_CAT(a, 1) = 10; // (a1) = 10
조건부 컴파일 지시사
조건식에 괄호 생략가능하며 컴파일할 문자에 중괄호 사용 안 함
defined 전처리 연산자 :조건식에 특정 매크로명이 정의되어 있는지 검사 시 사용
#if와 함께 묶어 #ifdef로 사용 가능 ec. #ifdef BIT16 == #if defined BIT16
!defined(= #ifndef) : 매크로명이 정의되지 않는 경우 확인
#undef 지시자 : 매크로명 정의 취소 ec. #undef BIT16 // BIT16 매크로명 정의 취소
#error 지시사 : 지시사 메세지를 컴파일 에러 메세지로 출력 후 컴파일 중단
#pragma
#pragma 지시자는 지시명을 통해 컴파일러의 기능 제어함
pack은 구조체의 패딩 바이트 결정
: #pragma pack은 구조체의 바이트 얼라인먼트 단위 크기 조절
* push: 바이트 얼라인먼트 바꿀 시 규칙 기억, pop는 이전의 규칙 복원
ec. #pragma pack(push, 1) // 바이트 얼라인먼트를 1로 바꿈 = #pragma pack(1)
#pragma pack(pop) //바이트 얼라인먼트 기존 규칙 복원
warning은 경고 메세지 제거
: #pragma warning는 컴파일러가 표시하는 경고 메세지 제거
ec. #pragma warnin(disable:4101) //4101번 경고 메세지 모두 표시하지 않음