C ++ 전처리
일부 처리기 지시문, 당신은 완료하는 데 필요한 실제 컴파일 전에 컴파일러에 대한 처리기를 지시합니다.
모든 처리기 지시문은 파운드 기호로 시작하는 (#)를 만 공백 문자가 처리기 지시문 전에 나타날 수 있습니다. C ++ 전 처리기 지시문은 문이 아닌, 그래서 그들은 세미콜론 있지 않으며, 마지막에 ().
우리는 이전의 모든 인스턴스사용법 #include 지시문을 보았다.이 매크로 소스 파일에 사용되는 헤더 파일을 포함한다.
C ++도 등 전처리 지시문, # 등이 포함 # 정의, 경우 #, 다른 #, # 라인을 지원한다, 우리가 이러한 중요한 지침을 살펴 보자.
#DEFINE 전처리
#DEFINE 처리기 지시문은 기호 상수를 만드는 데 사용. 기호 상수는 일반적으로 일반 명령의형태는, 매크로라고합니다 :
#define macro-name replacement-text
이 코드 줄이 파일에 표시하면 파일이 프로그램을 컴파일하기 전에 다음에서 모든 매크로 대체 텍스트로 대체됩니다 나타납니다. 예를 들면 :
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
이제,이 코드를 테스트 전처리의 결과를 살펴 보자. 이미 존재하는 소스 파일을 가정 한 후 컴파일하고 test.p.하는 결과를 리디렉션 할 -E 옵션을 사용하여 만약 test.p 파일을 보면 현재에는 이미 많은 정보를 포함하고, 다음과 같은 값이 파일의 하단에서 변경되었음을 표시됩니다
$gcc -E test.cpp > test.p ... int main () { cout << "Value of PI :" << 3.14159 << endl; return 0; }
매크로 기능
당신은 매개 변수를 다음과 같이 매크로를 정의 할 #DEFINE를 사용할 수 있습니다 :
#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"The minimum is " << MIN(i, j) << endl; return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
The minimum is 30
조건부 컴파일
컴파일 된 프로그램의 소스 코드의 부분을 선택적으로 사용할 수있는 여러 가지 명령이있다. 이 프로세스는 조건부 컴파일로 알려져있다.
구조와 많은 전처리 같은 경우 구조적 조건을 선택합니다. 다음 통로 처리기 코드를 살펴 보자 :
#ifndef NULL #define NULL 0 #endif
당신은 디버깅 컴파일 할 때 다음과 같이 디버깅, 매크로를 사용하여 실현 될 수있는 경우에만 할 수 있습니다 :
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
명령 #ifdef와 DEBUG는 기호 상수 DEBUG 정의되기 전에 경우 컴파일 된 프로그램cerr 문에있을 것입니다.다음과 같이 프로그램의 문 부분 밖으로 0 코멘트 #IF 사용할 수 있습니다 :
#if 0 不进行编译的代码 #endif
이제 다음 예를 봅시다 :
#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* 这是注释部分 */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"The minimum is " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
Trace: Inside main function The minimum is 30 Trace: Coming out of main function
# 그리고 ## 연산자
# ## 그리고 전처리 운영자가 사용할 수있는 C ++ 및 ANSI / ISO C입니다. # 운영자는 토큰 교체 텍스트는 인용 부호로 묶인 문자열로 변환됩니다.
다음 매크로 정의를 생각해 볼 수 있습니다 :
#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
HELLO C++
이제 어떻게 작동하는지 살펴 보자. 당연, C ++는 다음 줄을 전처리 :
cout << MKSTR(HELLO C++) << endl;
로 변환 :
cout << "HELLO C++" << endl;
## 연산자는 두 개의 토큰을 연결하는 데 사용됩니다. 다음은 그 예이다 :
#define CONCAT( x, y ) x ## y
CONCAT 프로그램에 표시 할 때, 그 파라미터는 링크 및 매크로를 대체하는 데 사용된다. 하기 실시 예에 나타낸 바와 같이 예를 들어, 프로그램 CONCAT (HELLO, C ++은), 「HELLO C ++ "로 대체된다.
#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
100
이제 어떻게 작동하는지 살펴 보자. 당연, C ++는 다음 줄을 전처리 :
cout << concat(x, y);
로 변환 :
cout << xy;
C ++ 사전 정의 된 매크로
C ++ 일부 사전 정의 된 매크로 아래의 표에 제공된다 :
宏 | 描述 |
---|---|
__LINE__ | 这会在程序编译时包含当前行号。 |
__FILE__ | 这会在程序编译时包含当前文件名。 |
__DATE__ | 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。 |
__TIME__ | 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。 |
우리가이 매크로의 예를 살펴 보자 :
#include <iostream> using namespace std; int main () { cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
Value of __LINE__ : 6 Value of __FILE__ : test.cpp Value of __DATE__ : Feb 28 2011 Value of __TIME__ : 18:52:48