Language 2010. 6. 16. 09:35

문자열 조작

 

#define SAY(x) printf(#x)

 

SAY(Hello, world!);

 

와 같이 식별자 앞에 # 를 붙이게 되면 자동으로 “x” 와 같이 “”로 둘러 싸 준다.

결과적으로

 

printf(“Hello, world!”);

 

로 대치될 것이다.

 

문자열 결합

 

## 는 두 개의 문자열을 결합해 준다.

 

#define Print(x) Print ## x

 

와 같이 된 경우

 

Print(One) 을 사용하면 PrintOne 이라는 문자열로 대치되고 Print(Two)  PrintTwo 라는 문자열로 대치된다.

잘 사용하면 아주 유용한 기능이 된다.

 

ASSERT()

 

대부분의 컴파일러는 ASSERT() 매크로를 가지고 있다여기서는 직접 하나 만들어 보자.

 

#ifndef DEBUG

#define ASSERT(x)

#else

#define ASSERT(x) \

       if ( ! (x) ) \

       { \

             printf(#x); \

             printf(“ is NULL on line %d in file %s”, __LINE__, __FILE__); \

       }

#endif

 

이 코드의 위에

 

#define DEBUG

 

한 줄 포함하면

 

#define ASSERT(x)

 

로 아무 일도 하지 않고 DEBUG가 정의되지 않으면 그 아래 함수가 정의된다.

디버그때만 코드가 생성되고 릴리즈시에는 코드가 생성되지 않게 할 수 있는 것이다.

 

여러 줄이 필요할 때는 \ 가 사용되었다는 것에 유의하자또한 내장 매크로인 __LINE__ 이나 __FILE__ 

다음에 설명한다.

 

내장 매크로

 

컴파일 시에 컴파일러가 미리 정의하고 있는 매크로들이 있다.

각각 오른 쪽에 있는 내용으로 대치된다.

 

__DATE__ : 컴파일하는 날짜

__TIME__ : 컴파일하는 시간

__LINE__ : 현재 컴파일하고 있는 줄 번호

__FILE__ : 현재 컴파일하고 있는 파일의 이름

 

#error

 

컴파일러는 이 명령을 만나게 되면 해당 메지시를 출력하고 컴파일을 중지한다.

C++ 컴파일러에서만 동작하게 하는 다음 코드를 참조하자.

 

#if !defined(__cplusplus)

#error C++ compiler required.

#endif

 

__cplusplus  C++ 컴파일러일 경우에 정의되는 내장 매크로이다.

 

#pragma

 

#pragma 는 컴파일러마다 고유하게 사용할 수 있는 명령어이다따라서 그 문법은 컴파일러마다

다르고 그 종류도 많다.

 

예를 들어

 

#pragma once

 

같은 경우 위의 포함감시 기능을 컴파일러가 알아서 해 준다한 번 include 된 헤더 파일은 중복해서

포함되지 않도록 컴파일러가 처리해 준다.

 

'Language' 카테고리의 다른 글

소스 코드는 매직아이^^  (1) 2010.11.01
posted by 동글동글82
: