무엇? 아직도 C++ 전처리기가 무엇인지 모르십니까? 이 글을 읽으면 충분합니다~

목차

C++ 전처리기

#define 전처리

매개변수 매크로

조건부 컴파일

# 및 ## 연산자

C++의 미리 정의된 매크로

최종 지식 포인트

마지막에 쓰기


C++ 전처리기

전처리기는 실제 컴파일 전에 수행할 전처리를 컴파일러에 알려주는 지시문입니다.

모든 전처리기 지시문은 파운드 기호(#)로 시작하며 전처리기 지시문 앞에는 공백 문자만 나타날 수 있습니다. 전처리 지시문은 C++ 문이 아니므로 세미콜론(;)으로 끝나지 않습니다.

우리는 이전의 모든 예제에서  #include  지시문이 있음을 확인했습니다. 이 매크로는 소스 파일에 헤더 파일을 포함하는 데 사용됩니다.

C++는 또한 #include, #define, #if, #else, #line 등과 같은 많은 전처리 지시어를 지원합니다. 이러한 중요한 지시어를 살펴보겠습니다.

#define 전처리

#define 전처리 지시문은 기호 상수를 만드는 데 사용됩니다. 이 기호 상수는 일반적으로 매크로 라고 하며 명령의 일반적인 형식은 다음과 같습니다.

#define 매크로 이름 교체 텍스트

이 코드 줄이 파일에 나타나면 파일에 나타나는 모든 후속 매크로는 프로그램이 컴파일되기 전에 대체 텍스트로 대체됩니다. 예를 들어:

#include <iostream>
using namespace std;
 
#define PI 3.14159
 
int main ()
{
 
    cout << "Value of PI :" << PI << endl; 
 
    return 0;
}

이제 이 코드를 테스트하고 전처리 결과를 살펴보겠습니다. 소스 코드 파일이 이미 존재한다고 가정하고 -E 옵션을 사용하여 결과를 컴파일하고 test.p로 리디렉션합니다. 이제 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 <<"较小的值为:" << MIN(i, j) << endl;
 
    return 0;
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

작은 값: 30

조건부 컴파일

프로그램 소스 코드의 일부를 선택적으로 컴파일하는 데 사용할 수 있는 여러 지시문이 있습니다. 이 프로세스를 조건부 컴파일이라고 합니다.

조건부 전처리기의 구조는 if 선택 구조와 매우 유사합니다. 다음 전처리기 코드를 고려하십시오.

#ifdef NULL 
   #define NULL 0 
#endif

디버깅할 때만 컴파일할 수 있습니다. 디버그 스위치는 다음과 같은 매크로로 구현할 수 있습니다.

#ifdef DEBUG 
   cerr <<"변수 x = " << x << endl; 
#endif

기호 상수 DEBUG가 지시문 #ifdef DEBUG 전에 정의된 경우 프로그램의  cerr 문이  컴파일됩니다. 다음과 같이 #if 0 문을 사용하여 프로그램의 일부를 주석 처리할 수 있습니다.

#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: main 함수 내부 
최소값은 30 
Trace: main 함수에서 나옴

# 및 ## 연산자

# 및 ## 전처리 연산자는 C++ 및 ANSI/ISO C에서 모두 사용할 수 있습니다. # 연산자는 대체 텍스트 토큰을 인용된 문자열로 변환합니다.

다음 매크로 정의를 참조하십시오.

#include <iostream>
using namespace std;
 
#define MKSTR( x ) #x
 
int main ()
{
    cout << MKSTR(HELLO C++) << endl;
 
    return 0;
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

안녕하세요 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++는 다음 표와 같이 사전 정의된 일부 매크로를 제공합니다.

매크로 설명하다
__선__ 여기에는 프로그램이 컴파일될 때 현재 줄 번호가 포함됩니다.
__파일__ 여기에는 프로그램이 컴파일될 때 현재 파일 이름이 포함됩니다.
__날짜__ 여기에는 소스 파일이 개체 코드로 변환된 날짜를 나타내는 월/일/연도 형식의 문자열이 포함됩니다.
__시간__ 여기에는 프로그램이 컴파일된 시간을 나타내는 시:분:초 형식의 문자열이 포함됩니다.

위에서 이러한 매크로의 예를 살펴보겠습니다.

#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;
}

 

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

__LINE__ 값: 6 
__FILE__ 값: test.cpp 
__DATE__ 값: 2011년 2월 28일 
__TIME__ 값: 18:52:48

최종 지식 포인트

#  및  ##  연산자

# 매크로 정의에 나오는 문자열화의 의미는 # 다음 매개변수를 문자열로 변환하는 것입니다.

문자열화 작업으로 사용될 때 #의 주요 기능은 확장 없이 매크로 매개변수를 문자열 상수로 변환하는 것입니다.

  •  매크로 정의 매개변수의 왼쪽과 오른쪽 공백은 무시되며 매개변수의 각 Token 사이의 여러 공백은 하나의 공백으로 변환됩니다.
  •  매크로 정의 매개변수에 " 또는 \와 같이 특별한 의미가 필요한 문자가 포함된 경우 자동으로 이스케이프 문자 \가 앞에 옵니다.

## 연결 기호, 매개변수를 함께 연결합니다.

여러 토큰을 하나의 토큰으로 연결합니다. 주요 요점:

  •  매크로 정의에서 첫 번째 또는 마지막 토큰일 수 없습니다.
  •  선행 및 후행 공백은 선택 사항입니다.
  1. 데이터 유형 및 변수 정의에는 정수, 부동 소수점, 문자 및 포인터와 같은 데이터 유형의 정의와 변수의 선언 및 초기화가 포함됩니다.

  2. 연산자 및 표현식에는 산술 연산자, 관계 연산자, 논리 연산자 등이 포함되며 표현식에 대한 평가 규칙도 포함됩니다.

  3. 제어문에는 조건문, 루프문, 점프문 등이 있습니다.

  4. 함수 및 매개변수 전달에는 함수 정의, 함수 반환값, 매개변수 전달 방법(값 전달, 포인터 전달 등)이 있습니다.

  5. 배열 및 포인터에는 배열 정의, 배열 요소에 대한 액세스, 다차원 배열, 포인터 정의, 포인터 작업 등이 포함됩니다.

  6. 문자열 처리에는 문자열 정의, 문자열에 대한 일반적인 작업(비교, 복사, 연결, 분할 등)이 포함됩니다.

  7. 파일 작업에는 파일 열기, 읽기, 쓰기 및 닫기와 같은 일반적인 작업이 포함됩니다.

  8. 메모리 관리에는 동적 메모리 할당 기능인 malloc 및 free 사용이 포함됩니다.

마지막에 쓰기

최근 트래픽이 점점 줄어들고 있으니 많은 관심과 수집 부탁드립니다 감사합니다

추천

출처blog.csdn.net/m0_64122244/article/details/130909015