전처리기는 컴파일 전에 소스 코드를 처리하는 프로그램입니다. C에서 프로그램을 작성하고 프로그램을 실행하는 데는 여러 단계가 포함됩니다. 실제로 전처리기에 대해 배우기 전에 이러한 단계를 살펴보겠습니다.

위 다이어그램에서 중간 단계를 볼 수 있습니다. 프로그래머가 작성한 소스 코드는 먼저 파일에 저장되며 이름은 다음과 같습니다. 프로그램.c . 그런 다음 이 파일은 전처리기에 의해 처리되고 확장된 소스 코드 파일인 program.i가 생성됩니다. 이 확장된 파일은 컴파일러에 의해 컴파일되며 program.obj라는 개체 코드 파일이 생성됩니다. 마지막으로 링커는 이 개체 코드 파일을 라이브러리 함수의 개체 코드에 연결하여 실행 파일인 program.exe를 생성합니다.
C의 전처리기 지시문
전처리기 프로그램은 컴파일하기 전에 소스 코드를 전처리하도록 컴파일러에 지시하는 전처리기 지시문을 제공합니다. 이러한 전처리기 지시문은 모두 '#'(해시) 기호로 시작됩니다. '#' 기호는 '#'으로 시작하는 모든 명령문이 실행되기 위해 전처리기 프로그램으로 이동한다는 것을 나타냅니다. 우리는 이러한 전처리기 지시문을 프로그램의 어느 곳에나 배치할 수 있습니다.
일부 전처리기 지시문의 예는 다음과 같습니다. #포함하다 , #정의하다 , #ifndef, 등.
메모 기억하세요. # 기호는 전처리기에 대한 경로만 제공하며, include와 같은 명령은 전처리기 프로그램에 의해 처리됩니다. 예를 들어 #include는 프로그램에 지정된 파일의 코드나 내용을 포함합니다.
C의 전처리기 지시문 목록
다음 표에는 C의 모든 전처리기 지시문이 나열되어 있습니다.
| 전처리기 지시문 | 설명 |
|---|---|
| #정의하다 | 매크로를 정의하는 데 사용됩니다. |
| #undef | 매크로 정의를 해제하는 데 사용됩니다. |
| #포함하다 | 소스 코드 프로그램에 파일을 포함하는 데 사용됩니다. |
| #ifdef | 특정 매크로가 #define으로 정의된 경우 코드 섹션을 포함하는 데 사용됩니다. |
| #ifndef | 특정 매크로가 #define으로 정의되지 않은 경우 코드 섹션을 포함하는 데 사용됩니다. |
| #만약에 | 지정된 조건을 확인하세요. |
| #또 다른 | #if 실패 시 실행되는 대체 코드 |
| #endif | #if, #ifdef 및 #ifndef의 끝을 표시하는 데 사용됩니다. |
이러한 전처리기는 수행하는 기능 유형에 따라 분류될 수 있습니다.
C 전처리기의 유형
전처리기 지시문에는 4가지 주요 유형이 있습니다.
- 매크로
- 파일 포함
- 조건부 컴파일
- 기타 지시문
이제 각 지시문에 대해 자세히 알아 보겠습니다.
1. 매크로
C에서 매크로는 특정 이름이 지정된 프로그램의 코드 조각입니다. 컴파일러에서 이 이름을 발견할 때마다 컴파일러는 해당 이름을 실제 코드 조각으로 바꿉니다. 그만큼 '#정의하다' 지시문은 매크로를 정의하는 데 사용됩니다.
매크로 정의 구문
#define token value>
전처리 후, 토큰 으로 확장될 예정입니다. 값 프로그램에서.
매크로의 예
씨
자바의 목록
// C Program to illustrate the macro> #include> // macro definition> #define LIMIT 5> int> main()> {> >for> (>int> i = 0; i printf('%d
', i); } return 0; }> |
>
>산출
0 1 2 3 4>
위 프로그램에서 컴파일러는 LIMIT라는 단어를 실행할 때 이를 5로 바꿉니다. '한계' 매크로 정의에서 매크로 템플릿이라고 합니다 그리고 '5'는 매크로 확장입니다.
메모 매크로 정의 끝에는 세미콜론(;)이 없습니다. 매크로 정의를 끝내기 위해 세미콜론이 필요하지 않습니다.
또한 일부 C의 사전 정의된 매크로 이는 우리 프로그램에 다양한 기능을 제공하는 데 유용합니다.
인수가 포함된 매크로
매크로에 인수를 전달할 수도 있습니다. 인수로 정의된 매크로는 함수와 유사하게 작동합니다.
예
#define foo( a, b ) a + b #define func(r) r * r>
프로그램을 통해 이를 이해해 보겠습니다.
씨
// C Program to illustrate function like macros> #include> // macro with parameter> #define AREA(l, b) (l * b)> int> main()> {> >int> l1 = 10, l2 = 5, area;> >area = AREA(l1, l2);> >printf>(>'Area of rectangle is: %d'>, area);> >return> 0;> }> |
>
>산출
Area of rectangle is: 50>
위 프로그램에서 컴파일러가 프로그램에서 AREA(l, b)를 찾을 때마다 이를 명령문 (l*b)으로 바꾸는 것을 볼 수 있습니다. 뿐만 아니라 매크로 템플릿 AREA(l, b)에 전달된 값도 명령문(l*b)에서 대체됩니다. 따라서 AREA(10, 5)는 10*5와 같습니다.
2. 파일 포함
이 유형의 전처리기 지시문은 컴파일러에게 소스 코드 프로그램에 파일을 포함하도록 지시합니다. 그만큼 #include 전처리기 지시어 C 프로그램에 헤더 파일을 포함하는 데 사용됩니다.
사용자가 프로그램에 포함할 수 있는 파일에는 두 가지 유형이 있습니다.
표준 헤더 파일
표준 헤더 파일에는 다음과 같은 사전 정의된 함수의 정의가 포함되어 있습니다. 프린트프(), 스캔프(), 등. 이러한 기능을 사용하려면 이러한 파일이 포함되어야 합니다. 서로 다른 함수는 서로 다른 헤더 파일에 선언됩니다.
예를 들어, 표준 I/O 함수는 'iostream' 파일에 있고 문자열 작업을 수행하는 함수는 'string' 파일에 있습니다.
통사론
#include < file_name>>
어디 파일 이름 포함할 헤더 파일의 이름입니다. 그만큼 '' 괄호 컴파일러에게 s에서 파일을 찾도록 지시합니다. 표준 디렉토리.
사용자 정의 헤더 파일
프로그램이 매우 커지면 작은 파일로 나누고 필요할 때마다 포함시키는 것이 좋습니다. 이러한 유형의 파일은 사용자 정의 헤더 파일입니다.
통사론
#include ' filename '>
그만큼 큰따옴표( ) 컴파일러에게 헤더 파일을 검색하라고 지시합니다. 소스 파일의 디렉토리.
3. 조건부 컴파일
C 지시문의 조건부 컴파일 프로그램의 특정 부분을 컴파일하거나 일부 조건에 따라 프로그램의 특정 부분의 컴파일을 건너뛰는 데 도움이 되는 일종의 지시어입니다. 조건부 코드를 삽입하는 데 사용되는 전처리기 지시문은 다음과 같습니다.
- #if 지시어
- #ifdef 지시어
- #ifndef 지시어
- #else 지시어
- #elif 지시어
- #endif 지시어
#endif 지시문은 #if, #ifdef 및 #ifndef 열기 지시문을 닫는 데 사용됩니다. 이는 이러한 지시문의 전처리가 완료되었음을 의미합니다.
통사론
#ifdef macro_name // Code to be executed if macro_name is defined # ifndef macro_name // Code to be executed if macro_name is not defined #if constant_expr // Code to be executed if constant_expression is true #elif another_constant_expr // Code to be excuted if another_constant_expression is true #else // Code to be excuted if none of the above conditions are true #endif>
'라는 이름의 매크로가 있는 경우 매크로_이름 '가 정의되면 명령문 블록은 정상적으로 실행되지만, 정의되지 않은 경우 컴파일러는 이 명령문 블록을 건너뜁니다.
예
아래 예에서는 #include #if, #elif, #else 및 #endif 전처리기 지시문의 사용을 보여줍니다.
씨
숨겨진 앱을 공개하는 방법
//program to demonstrates the use of #if, #elif, #else,> // and #endif preprocessor directives.> #include> // defining PI> #define PI 3.14159> int> main()> {> > #ifdef PI> >printf>(>'PI is defined
'>);> > #elif defined(SQUARE)> >printf>(>'Square is defined
'>);> #else> >#error 'Neither PI nor SQUARE is defined'> #endif> > #ifndef SQUARE> >printf>(>'Square is not defined'>);> #else> >cout <<>'Square is defined'> << endl;> #endif> >return> 0;> }> |
>
>산출
PI is defined Square is not defined>
4. 기타 지시문
위의 지시문 외에도 일반적으로 사용되지 않는 지시문이 두 개 더 있습니다. 이것들은:
- #undef 지시어
- #pragma 지시어
1. #undef 지시문
#undef 지시문은 기존 매크로를 정의 해제하는 데 사용됩니다. 이 지시문은 다음과 같이 작동합니다.
#undef LIMIT>
이 문을 사용하면 기존 매크로 LIMIT의 정의가 해제됩니다. 이 문 이후의 모든 #ifdef LIMIT 문은 false로 평가됩니다.
예
아래 예는 #undef 지시문의 작동을 보여줍니다.
씨
#include> // defining MIN_VALUE> #define MIN_VALUE 10> int> main() {> >// Undefining and redefining MIN_VALUE> printf>(>'Min value is: %d
'>,MIN_VALUE);> > //undefining max value> #undef MIN_VALUE> > // again redefining MIN_VALUE> #define MIN_VALUE 20> >printf>(>'Min value after undef and again redefining it: %d
'>, MIN_VALUE);> >return> 0;> }> |
>
>산출
Min value is: 10 Min value after undef and again redefining it: 20>
2. #pragma 지시문
이 지시어는 특수 목적 지시어이며 일부 기능을 켜거나 끄는 데 사용됩니다. 이러한 유형의 지시문은 컴파일러마다 다릅니다. 즉, 컴파일러마다 다릅니다.
통사론
#pragma directive>
#pragma 지시문 중 일부는 아래에 설명되어 있습니다.
- #pragma 시작: 이러한 지시어는 프로그램 시작 전(컨트롤이 main()으로 전달되기 전) 실행하는 데 필요한 기능을 지정하는 데 도움이 됩니다.
- #pragma 종료 : 이 지시문은 프로그램 종료 직전(컨트롤이 main()에서 반환되기 직전)을 실행하는 데 필요한 기능을 지정하는 데 도움이 됩니다.
아래 프로그램은 GCC 컴파일러에서는 작동하지 않습니다.
예
아래 프로그램 #pragma 종료 및 pragma 시작 사용 설명
씨
// C program to illustrate the #pragma exit and pragma> // startup> #include> void> func1();> void> func2();> // specifying funct1 to execute at start> #pragma startup func1> // specifying funct2 to execute before end> #pragma exit func2> void> func1() {>printf>(>'Inside func1()
'>); }> void> func2() {>printf>(>'Inside func2()
'>); }> // driver code> int> main()> {> >void> func1();> >void> func2();> >printf>(>'Inside main()
'>);> >return> 0;> }> |
>
>
예상 출력
Inside func1() Inside main() Inside func2()>
위 코드는 GCC 컴파일러에서 실행될 때 아래와 같은 출력을 생성합니다.
Inside main()c>
이는 GCC가 #pragma 시작 또는 종료를 지원하지 않기 때문에 발생합니다. 그러나 GCC 컴파일러에서 예상되는 출력에 대해 아래 코드를 사용할 수 있습니다.
씨
#include> void> func1();> void> func2();> void> __attribute__((constructor)) func1();> void> __attribute__((destructor)) func2();> void> func1()> {> >printf>(>'Inside func1()
'>);> }> void> func2()> {> >printf>(>'Inside func2()
'>);> }> int> main()> {> >printf>(>'Inside main()
'>);> >return> 0;> }> |
>
>산출
Inside func1() Inside main() Inside func2()>
위 프로그램에서 우리는 몇 가지를 사용했습니다. 특정 구문 따라서 함수 중 하나는 주 함수보다 먼저 실행되고 다른 하나는 주 함수 후에 실행됩니다.
#pragma warning 지시어
이 지시문은 컴파일 중에 표시되는 경고 메시지를 숨기는 데 사용됩니다. 아래와 같이 경고를 숨길 수 있습니다.
- #pragma 경고 -rvl : 이 지시문은 값을 반환해야 하는 함수가 값을 반환하지 않을 때 발생하는 경고를 숨깁니다.
- #pragma 경고 -par : 이 지시문은 함수가 전달된 매개변수를 사용하지 않을 때 발생하는 경고를 숨깁니다.
- #pragma 경고 -rch : 이 지시어는 코드에 접근할 수 없을 때 발생하는 경고를 숨깁니다. 예를 들어, 반품 함수의 명령문에 접근할 수 없습니다.
techcodeview.com를 좋아하고 기여하고 싶다면 다음을 사용하여 기사를 작성할 수도 있습니다. . techcodeview.com 메인 페이지에 나타나는 기사를 보고 다른 Geeks를 도와주세요. 잘못된 내용을 발견했거나 위에서 논의한 주제에 대해 더 많은 정보를 공유하고 싶다면 의견을 작성해 주세요.