2014년 4월 6일 일요일



전처리문(#include, #define, #ifdef...)
컴파일 이전에 미리 처리되는 문장(=선행처리기) 소스코드를 지우지 않고 활성화/비활성화 하는데 이용된다. 첫문자는 '#' 사용

전처리문의 종류
#include //파일처리를 위한
#define, #undef //형태 정의를 위한
#in, #ifdef, #else, #elif, #endif //조건 처리를 위한
#error  //에러 처리를 위한
#line //디버깅을 위한
#pragma //컴파일 옵션 처리를 위한



#include : 외부파일을 읽어서 포함시키자 사용
#include <stdio.h> // <> 표준 포함 디렉토리 검사
#include "NewMonster.h" // ""현재 폴더 기준 검사


#define : 상수값 지정을 위한 매크로
#define SUM(x) ((x) = (x) + (x))
#define MYFILENAME = "Myfile"


#undef : 이미 정의된 매크로를 무시
#define ADD(a, b) (a+b)
#undef ADD(a, b) //앞에 정의된 ADD 'undefined symbol' 처리


#if~ #endif : 어떤 구문을 컴파일 할지 말지를 결정
#define A 1 //A 1이기 때문에 true
#if A
   source code… //컴파일
#endif

#ifdef ~ #endif : 컴파일
#define MYDEF
#ifdef MYDEF2
   #define BASE 10 //BASE = 10
#elif MYDEF
   #define BASE 2 //BASE = 2
#endif
//BASE 2 된다


#ifndef 헤더명_H__ ~ #endif : 헤더 중복을 방지
#ifndef STDIO_H__ //STDIO_H 선언되지 않았다면
#define STDIO_H__ //STDIO_H 선언


#defined : define이 여러 정의되어있는지 확인
#if #defined A || #defined B


#ifdef #if defined 차이점
#ifdef 정의가 되었는지 확인을 한번에 여러 없다.
#if defined(MACRO1) || defined(MACRO2)
= #if MACRO1 || MACRO2


#error : 소스라인에서 #error 만나면 컴파일을 멈추고 메시지를 출력한다.
#ifdef __LARGE__
   #error This program must be compiled in LARGE memory model!
#endif
//#ERROR : 현재컴파일중인파일명 행번호 ErrorDirective내용


#line : 소스코드에 번호를 지정하기 위한 . 미리 정의된 __LINE__ 사용
__LINE__ ( 번호), __FILE__(파일 )


#pragma : 컴파일러에게 명령 전달 지시어
#pragma inline : 컴파일시 어셈블러를 사용하도록 지시
#pragma savereges : 휴즈 메모리 모델에 대해 컴파일 함수를 레지스터에 저장
#pragma warn //Turbo C에게 경고 메시지 무시 옵션
#pragma warn -par //매개변수가 사용되지 않았다고 경고를 내지 못하도록 한다.
#pragma warn +par //위와 반대표현

Cf) (-) 경고 OFF, (+) 경고 ON, 예로 명령행에서 -wxxx 경고 ON, -w-xxx 경고 OFF

Par : 전해진 파라미터 미사용
Rvl : void형이 아닌 함수에서 리턴 없음
Aus : 변수에 값을 할당했으나 사용하지 않음
Voi : void함수에서 리턴값 사용되지 않음
Sig : 부호비트가 고려되지 않은 형변환에서 부호 비트 소실 가능성

C 미리 정의된 매크로
__FILE__ //컴파일된 파일의 경로
__LINE__ //현재 행번호를 유지하는 정수
__DATE__ //현재 시스템 날짜를 가진 문자열
__TIME__ //현재 시스템 시간을 가진 문자열
__STDC__ //값 1을 정의하는 ANSI C표준

__cplusplus //c,c++모드 인 경우 c++로 정의


cf) #define 정의__ : 왜 뒤에 '_' 나 '__'를 붙였을까? 암시적 약속이다.

참조 블로그
cf)msdn 미리 정의 된 매크로

0 개의 댓글:

댓글 쓰기