카테고리 없음

[c] # 전처리문의 종류

Hemos 2019. 10. 31. 01:19

#include, #define, #ifndef, #defined, #undef 등
선행처리기
: 실질적인 컴파일 이전에 미리 처리되는 문장을 가리킨다.
따라서 컴파일러는 사용자가 작성한 코드를 컴파일 하기 전에 전처리문에서 정의해 놓은 
작업들을 먼저 수행한다. 

. 기존에 있는 소스코드를 건드리지 않는 상태에서 부분적인 컴파일을 하는 것.

C의 전처리문이 오는 줄의 첫 문자는 항상 '#'으로 시작한다.

- 파일처리를 위한 전처리문 : #include
- 형태정의를 위한 전처리문 : #define, #undef
- 조건처리를 위한 전처리문 : #if, #ifdef, #ifndef,  #else, #else, #elif, #endif
- 에러처리를 위한 전처리문 : #error
- 디버깅을 위한 전처리문 : #line
- 컴파일 옵션처리를 위한 전처리문 : #pragma (만능. 컴파일에게 그 뒤에오는 내용에 따라 어떤 일을 하라)

조건 처리를 위한 전처리문은 어떤 조건에 대한 검사를 하고, 그 결과를
참 또는 거짓으로 돌려준다. (거짓:0, 참:!0)
#if : ~이 참이라면
#ifdef : ~이 정의되어 있다면
#else : #if || #ifdef에 대응됨
#elif : "else + if" 의 의미
#endif : #if, #ifdef, #ifndef 이 끝났음을 알린다.


#include
헤더 파일과 같은 외부 파일을 읽어서 포함시키고자 할 때 사용됨.
이때 파일은 이진파일이 아닌 C의 소스파일과 같은 형태의 일반 문서파일을 말함.
<> : 컴파일러의 표준 포함 파일 디렉토리 (또는 사용자의 별도 지정)에서 파일을 찾는 것을 기본.
"" : 현재 디렉토리 기본으로 파일찾기.
* 아예 디렉토리를 파일명에 같이 지정 가능.

#define
상수값을 지정하기 위한 예약어. 매크로라 부름.
구문의 상수로 치환한다. 함수의 역할과 비슷하게 쓰일 수 있다. (*lambda?)
(*낭비의 경우?)

#undef
#define으로 이미 정의된 매크로를 무효화 한다.

#if ~ #endif
컴파일 조건

#ifdef ~ #endif
~으로 def되어 있는가
참에 실행 (1)

#ifndef 헤더명_H__~ #endif
헤더파일 겹치는 것 막기 위한 일종의 매크로. 
이미 include 하고 있는 헤더파일을 두번 define 하게 되면, SYNTAX 에러
이전에 include 되어 있으면 #endif쪽으로 점프. 결국 한번 선언되는 것.
(ifnotdefine?)
헤더안에?
#ifndef ~_H__
#define ~_H__
(*stdio.h : Standard Input/Output library)

#defined
define이 여러개 되어 있는지를 검사할 때 씀.
여러개를 동시에 검사할 수 있음.
#if #defined A || #defined B

#ifdef와 #if defined의 차이
#ifdef는 정의가 되어 있는지를 테스트하기 때문에, 한번에 여러 개를 사용할 수 없다.
형식이 #if expression 이므로, C 표현이 올 수 있다.
 #if MACRO1 || MACRO2
처럼 사용가능.

#error
소스라인에 직접 에러 메세지를 출력한다.
전처리기가 #error문을 만나면 그 즉시 컴파일을 중단하고 에러 메세지를 출력한다.
ERROR : (현재 컴파일중인 파일명).c (전처리기가 #error문을 만난 시점에서의 행 번호(헤더 포함)):Error directive: 내용
 #ifdef __LARGE__
   #error This program must be compiled in LARGE memory model !
 #endif

#line
소스 코드의 행번호를 지정하기 위한 것으로 주로 컴파일러에 의해 미리 정의된 __LINE__과 함꼐 사용된다.
C에서는 베이식과 같은 행번호를 사용하지 않는다.
하지만 디버깅을 하다보면 필요할 경우가 있는데, #line을 사용함으로써 그 표현이 있는 행을 찾을 수 있다.
 __LINE__과 __FILE__을 각각 행번호와 파일명으로 변경한다.

#line 100 (* 다음 줄번호를 100으로 설정한다. )
printf("%d", __LINE__)

 

C의 predefined macro
__FILE__ : a string that holds the path/name of the compiled file
__LINE__ : an integer(정수) that holds the number of the current line number
__DATA__ : a string that holds the current system data
__TIME__ : a string that holds the current system time
__STDC__ : defined as the value '1' if the compiler conforms with the ANSI C standard
__cplusplus : determines if your compiler is in C or C++ mode. Usually used in headers

코딩 암시적 약속.
보통 매크로, const 변수는 대문자로 적는 것이 원칙.
매크로 함수와 일반함수, 매크로 대상체와 일반 변수를 구분하기 쉽게 해주는 것이기 때문.
#define STDIO_H_
뒤에 _를 붙인 이유. 하나의 암시적 약속. 컴파일러 제작회사에서 매크로를 정의할 때 사용자들과 이름이 충돌이 나지 않게 하기 위해서 덧붙임. 강제적 뜻은 없지만, 컴파일러 내부에서 사용하는 매크로라는 성격이 강함. 
/ 보통 매크로 변수 이름이나 함수 이름을 지을 때 뒤에 _를 붙이지 않기 때문.

 

https://blog.naver.com/dusjjang/60017406476