전처리기 실제 컴파일이 시작되기 전에 소스 코드를 처리하는 프로그램입니다. 이는 컴파일 프로세스의 일부가 아니지만 별도로 작동하여 프로그래머가 컴파일 전에 코드를 수정할 수 있습니다.
- C 소스코드가 실행파일로 변환될 때 거치는 첫 번째 단계입니다.
- 전처리기 지시문의 주요 유형은 다음과 같습니다. 매크로 파일 포함 조건부 컴파일 및 #undef #pragma 등과 같은 기타 지시문
- 주로 이러한 지시문은 C 코드의 특정 섹션을 다른 C 코드로 바꾸는 데 사용됩니다. 예를 들어 '#define PI 3.14'라고 쓰면 전처리기에 의해 PI가 3.14로 대체됩니다.
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 지시문 중 일부는 아래에 설명되어 있습니다.
- #pragma 시작: 이러한 지시어는 프로그램 시작 전(컨트롤이 main()으로 전달되기 전) 실행하는 데 필요한 기능을 지정하는 데 도움이 됩니다.
- #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()
위 프로그램에서 우리는 몇 가지를 사용했습니다. 특정 구문 따라서 함수 중 하나는 주 함수보다 먼저 실행되고 다른 하나는 주 함수 후에 실행됩니다.
퀴즈 만들기