목차
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 사이의 여러 공백은 하나의 공백으로 변환됩니다.
- 매크로 정의 매개변수에 " 또는 \와 같이 특별한 의미가 필요한 문자가 포함된 경우 자동으로 이스케이프 문자 \가 앞에 옵니다.
## 연결 기호, 매개변수를 함께 연결합니다.
여러 토큰을 하나의 토큰으로 연결합니다. 주요 요점:
- 매크로 정의에서 첫 번째 또는 마지막 토큰일 수 없습니다.
- 선행 및 후행 공백은 선택 사항입니다.
-
데이터 유형 및 변수 정의에는 정수, 부동 소수점, 문자 및 포인터와 같은 데이터 유형의 정의와 변수의 선언 및 초기화가 포함됩니다.
-
연산자 및 표현식에는 산술 연산자, 관계 연산자, 논리 연산자 등이 포함되며 표현식에 대한 평가 규칙도 포함됩니다.
-
제어문에는 조건문, 루프문, 점프문 등이 있습니다.
-
함수 및 매개변수 전달에는 함수 정의, 함수 반환값, 매개변수 전달 방법(값 전달, 포인터 전달 등)이 있습니다.
-
배열 및 포인터에는 배열 정의, 배열 요소에 대한 액세스, 다차원 배열, 포인터 정의, 포인터 작업 등이 포함됩니다.
-
문자열 처리에는 문자열 정의, 문자열에 대한 일반적인 작업(비교, 복사, 연결, 분할 등)이 포함됩니다.
-
파일 작업에는 파일 열기, 읽기, 쓰기 및 닫기와 같은 일반적인 작업이 포함됩니다.
-
메모리 관리에는 동적 메모리 할당 기능인 malloc 및 free 사용이 포함됩니다.
마지막에 쓰기
최근 트래픽이 점점 줄어들고 있으니 많은 관심과 수집 부탁드립니다 감사합니다