logo

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 definedn'); // If PI is not defined check if SQUARE is defined #elif defined(SQUARE)  printf('Square is definedn'); // 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() 

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

퀴즈 만들기