Latest web development tutorials

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