C 전처리기

C 전처리기

전처리기 실제 컴파일이 시작되기 전에 소스 코드를 처리하는 프로그램입니다. 이는 컴파일 프로세스의 일부가 아니지만 별도로 작동하여 프로그래머가 컴파일 전에 코드를 수정할 수 있습니다.

  • C 소스코드가 실행파일로 변환될 때 거치는 첫 번째 단계입니다.
  • 전처리기 지시문의 주요 유형은 다음과 같습니다.  매크로 파일 포함 조건부 컴파일 및 #undef #pragma 등과 같은 기타 지시문
  • 주로 이러한 지시문은 C 코드의 특정 섹션을 다른 C 코드로 바꾸는 데 사용됩니다. 예를 들어 '#define PI 3.14'라고 쓰면 전처리기에 의해 PI가 3.14로 대체됩니다.
C 전처리기

C 전처리기의 유형

위의 모든 전처리기는 4가지 유형으로 분류될 수 있습니다.

매크로

매크로 상수를 정의하거나 코드가 컴파일되기 전에 전처리기에 의해 대체되는 함수를 만드는 데 사용됩니다. 두 개의 전처리기 #정의하다 그리고 #undef C에서 매크로를 생성하고 제거하는 데 사용됩니다.

#정의하다 토큰 가치
#undef 토큰

전처리 후 토큰 으로 확장될 예정입니다. 프로그램에서.

예:

C
   #include         // Macro Definition   #define LIMIT 5   int     main  (){      for     (  int     i     =     0  ;     i      <     LIMIT  ;     i  ++  )     {      printf  (  '%d   n  '       i  );      }      return     0  ;   }   

산출
0 1 2 3 4  

위 프로그램에서는 컴파일이 시작되기 전 LIMIT라는 단어가 5로 대체됩니다. '한계' 매크로 정의에서 매크로 템플릿이라고 합니다 그리고 '5'는 매크로 확장입니다.

메모 매크로 정의 끝에는 세미콜론(;)이 없습니다. 매크로 정의를 끝내기 위해 세미콜론이 필요하지 않습니다.

또한 일부가 있습니다 C의 사전 정의된 매크로 이는 우리 프로그램에 다양한 기능을 제공하는 데 유용합니다.

이전에 정의된 매크로는 #undef 전처리기를 사용하여 정의 해제할 수 있습니다. 예를 들어 위 코드에서

C
   #include         // Macro Definition   #define LIMIT 5   // Undefine macro   #undef LIMIT   int     main  (){      for     (  int     i     =     0  ;     i      <     LIMIT  ;     i  ++  )     {      printf  (  '%d   n  '       i  );      }      return     0  ;   }   


산출:

 ./Solution.c: In function 'main': ./Solution.c:13:28: error: 'MAX' undeclared (first use in this function) printf('MAX is: %dn' MAX); ^ ./Solution.c:13:28: note: each undeclared identifier is reported only once for each function it appears in  

인수가 포함된 매크로

매크로에 인수를 전달할 수도 있습니다. 이러한 매크로는 함수와 유사하게 작동합니다. 예를 들어

# 정의하다 foo(a b) a + b
#define func(r) r * r

프로그램을 통해 이를 이해해 보겠습니다.

C
   #include         // macro with parameter   #define AREA(l b) (l * b)   int     main  (){      int     a     =     10       b     =     5  ;          // Finding area using above macro      printf  (  '%d'       AREA  (  a       b  ));      return     0  ;   }   

산출
Area of rectangle is: 50  

설명: 위 프로그램에서 매크로는 면적(lb) 직사각형의 면적을 곱하여 직사각형의 면적을 계산하도록 정의됩니다. 길이(l) 그리고 폭 (b) . 언제 지역(a b) 으로 확장된다고 합니다. (a * b) 결과가 계산되어 인쇄됩니다.

참조하십시오 C의 매크로 유형 더 많은 예시와 유형을 확인하세요.

파일 포함

파일 포함을 사용하면 외부 파일(헤더 파일 라이브러리 등)을 현재 프로그램에 포함할 수 있습니다. 이는 일반적으로 다음을 사용하여 수행됩니다. #포함하다 시스템 및 사용자 정의 파일을 모두 포함할 수 있는 지시문입니다.

통사론

헤더 파일을 포함하는 방법에는 두 가지가 있습니다.

#포함하다
#포함하다 '파일 이름'

그만큼 ' <' 그리고 '>' 괄호 컴파일러에게 다음에서 파일을 찾도록 지시합니다. 표준 디렉토리 ~하는 동안 큰따옴표( ' ' ) 소스 파일의 디렉터리에서 헤더 파일을 검색하도록 컴파일러에 지시합니다.

예:

C
   // Includes the standard I/O library   #include            int     main  ()     {      printf  (  'Hello World'  );          return     0  ;   }   

산출
Hello World 

조건부 컴파일

조건부 컴파일 특정 조건에 따라 코드의 일부를 포함하거나 제외할 수 있습니다. 이는 플랫폼별 코드를 생성하거나 디버깅하는 데 유용합니다. 다음과 같은 조건부 전처리기 지시문이 있습니다: #if #ifdef #ifndef else #elif 및 #endif

통사론

조건부 전처리기의 일반적인 구문은 다음과 같습니다.

#만약에
// 일부 코드
#elif
// 추가 코드
#또 다른
// 추가 코드
#endif

#endif 지시문은 #if #ifdef 및 #ifndef 열기 지시문을 닫는 데 사용됩니다.

C
   #include         // Defining a macro for PI   #define PI 3.14159   int     main  (){       // Check if PI is defined using #ifdef   #ifdef PI      printf  (  'PI is defined  n  '  );   // If PI is not defined check if SQUARE is defined   #elif defined(SQUARE)      printf  (  'Square is defined  n  '  );   // If neither PI nor SQUARE is defined trigger an error   #else      #error 'Neither PI nor SQUARE is defined'   #endif   // Check if SQUARE is not defined using #ifndef   #ifndef SQUARE      printf  (  'Square is not defined'  );   // If SQUARE is defined print that it is defined   #else      printf  (  'Square is defined'  );   #endif      return     0  ;   }   

산출
PI is defined Square is not defined 

설명: 이 코드는 조건부 전처리기 지시문( #ifdef #elif 및 #ifndef ) 특정 매크로( PI 그리고 정사각형 )이 정의되어 있습니다. PI가 정의되었으므로 프로그램은 ' PI가 정의됩니다 ' 그런 다음 SQUARE가 정의되지 않았는지 확인하고 '를 인쇄합니다. 정사각형이 정의되지 않았습니다. '.

기타 지시어

기본 전처리기 지시문 외에도 C는 컴파일러 동작 및 디버깅을 관리하기 위한 다른 지시문도 제공합니다.

#pragma:

동작을 제어하기 위해 컴파일러에 특정 지침을 제공합니다. 경고 설정 정렬 등을 비활성화하는 데 사용됩니다.

통사론

#프라그마 지령

#pragma 지시문 중 일부는 아래에 설명되어 있습니다. 

  1. #pragma 시작: 이러한 지시어는 프로그램 시작 전(컨트롤이 main()으로 전달되기 전) 실행하는 데 필요한 기능을 지정하는 데 도움이 됩니다.
  2. #pragma 종료 : 이 지시문은 프로그램 종료 직전(컨트롤이 main()에서 반환되기 직전)을 실행하는 데 필요한 기능을 지정하는 데 도움이 됩니다.

C
   #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()  n  '  );     }   void     func2  ()     {     printf  (  'Inside func2()  n  '  );     }   int     main  (){      void     func1  ();      void     func2  ();      printf  (  'Inside main()  n  '  );      return     0  ;   }   

산출
Inside main()  

위 코드는 예상 출력이 다음과 같은 동안 GCC 컴파일러에서 실행될 때 위와 같은 출력을 생성합니다.

예상 출력

 Inside func1() Inside main() Inside func2()   

이는 GCC가 #pragma 시작 또는 종료를 지원하지 않기 때문에 발생합니다. 그러나 GCC 컴파일러에서 예상되는 출력에 대해 아래 코드를 사용할 수 있습니다. 

C
   #include         void     func1  ();   void     func2  ();   void     __attribute__  ((  constructor  ))     func1  ();   void     __attribute__  ((  destructor  ))     func2  ();   void     func1  ()   {      printf  (  'Inside func1()  n  '  );   }   void     func2  ()   {      printf  (  'Inside func2()  n  '  );   }   int     main  ()   {      printf  (  'Inside main()  n  '  );      return     0  ;   }   

산출
Inside func1() Inside main() Inside func2()  

위 프로그램에서 우리는 몇 가지를 사용했습니다. 특정 구문 따라서 함수 중 하나는 주 함수보다 먼저 실행되고 다른 하나는 주 함수 후에 실행됩니다.

퀴즈 만들기