프로그래밍 언어/C언어

[C언어] 전처리

엉덩이싸움 2024. 2. 3. 20:15

전처리 지시사

전처리 지시사 : 컴파일 전 컴파일 환경에 맞게 소스 코드를 편집함

컴파일과정

#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

조건부 컴파일 지시사

#if, #esle, #elif,  #endif 전처리 지시사

 조건식에 괄호 생략가능하며 컴파일할 문자에 중괄호 사용 안 함

 

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번 경고 메세지 모두 표시하지 않음