'Language'에 해당되는 글 2건
- 2010.11.01 :: 소스 코드는 매직아이^^ 1
- 2010.06.16 :: C 전처리기의 명령어 몇가지
처음에는 만만치 않더니 저번주가 되니까 뭔가 보이기 시작합니다.
마치 매직아이처럼요...ㅋㅋㅋ
위 그림은 달 두개만 있는 것 처럼보이지만...
매직아이를 이용하면 입체적으로 튀어나온 그림과 함께 숨겨진 메세지를 찾을 수 있습니다.
처음에 보기위해선 노력이 필요하지만, 그 뒤에는 손 쉽게 볼 수 있지요...
소스코드도 마찬가지 입니다.
<본 소스코드는 웹상을 뒤져서 가져온 것입니다. 혹시 저작권 문제가 있다면 덧글 달아주신다십시요. 바로 삭제하도록 하겠습니다.>
이건 영어도 아닌것이, 한국어도 아니고... 당췌 무슨 소린지 못알아 듣게 보이지만...
한 달동안 열심히 보다보니 매직아이처럼 중요한 부분이 툭툭 튀어나오네요^^
아직 깔끔하게 보이진 않지만 그래도 꽤나 잘 보입니다.
빨리 끝내야죠... 그리고 다음으로 넘어가야죠...
'Language' 카테고리의 다른 글
C 전처리기의 명령어 몇가지 (0) | 2010.06.16 |
---|
문자열 조작
#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 |
---|