C 전 처리기
C 전처리의 일부 컴파일러 아니라, 별도의 공정을 컴파일하는 과정이다.즉, C 프리 프로세서는 텍스트 대체 도구는, 그들이 실제 필요하기 전에 완전한 전처리를 컴파일하도록 컴파일러에 지시 할 것이다. 우리는 C 전 처리기 (C 프리 프로세서)는 CPP로 축약됩니다.
모든 주문은 처음에 파운드 기호 (#)로 전처리이다. 그것은 첫 번째 공백이 아닌 문자 여야합니다 가독성을 향상시키기 위해, 처리기 지시문은 첫 번째 열에서 시작해야한다. 아래에 나열된 모든 중요한 사전 프로세서 명령어입니다
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
전처리의 예는
분석은 다음과 같은 예를 다른 지시 사항을 이해합니다.
#define MAX_ARRAY_LENGTH 20
이 지시어는 CPP 모든 MAX_ARRAY_LENGTH (20)를 교체 알려줍니다. 가독성을 향상시키기 위해 상수를 정의하는#DEFINE를 사용합니다.
#include <stdio.h> #include "myheader.h"
이지침은 시스템 라이브러리에서 얻고, 현재 소스 파일에 텍스트를 추가 STDIO.H CPP를 말한다.다음 줄은 로컬 디렉토리에서 얻을 현재 소스 파일에 내용을 추가myheader.h CPP를 알려줍니다.
#undef FILE_SIZE #define FILE_SIZE 42
이 명령은 CPP가 FILE_SIZE 정의 취소하고 42로 정의 알려줍니다.
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
이 명령은 메시지를 정의 할 때 메시지는 정의되지 않은 CPP 경우에만 알려줍니다.
#ifdef DEBUG /* Your debugging statements here */ #endif
당신이 DEBUG를 정의하면이 명령은 다음 처리 문을 수행 CPP를 알려줍니다. 당신이 GCC 컴파일러-DDEBUG 스위치를전달하는 경우 컴파일시에,이 명령은 유용합니다. 그것은 DEBUG를 정의, 당신은 항상 켜거나 컴파일시 디버깅을 해제 할 수 있습니다.
사전 정의 된 매크로
ANSI C 매크로의 수를 정의합니다. 프로그램에서는이 매크로를 사용할 수 있지만 다른 직접이 미리 정의 된 매크로를 수정할 수 있습니다.
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
이제 다음 예를 봅시다 :
#include <stdio.h> main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ ); }
(test.c에있는) 상기 코드는 컴파일되고 실행되는 경우, 다음과 같은 결과를 얻게
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
전 처리기 연산자
C 프리 프로세서는 매크로를 만들 수 있도록 다음과 같은 연산자를 제공합니다 :
매크로 연산자의 연속 (\)
매크로는 일반적으로 한 줄에 기록됩니다. 매크로가 한 줄에 맞게 너무 긴 경우, 매크로 연산자 (\)의 지속을 사용합니다. 예를 들면 :
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
문자열 리터럴 양자화 연산자 (#)
매크로 정의에서, 당신은 문자열 상수로 매크로 인수를 넣을 필요가있을 때, 문자열 상수 양자화 연산자 (#). 매크로를 사용하여 연산자는 특정 매개 변수 또는 매개 변수 목록이 있습니다. 예를 들면 :
#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void) { message_for(Carole, Debra); return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
Carole and Debra: We love you!
토큰 붙여 넣기 연산자 (##)
매크로의 정의 내에서 토큰 붙여 넣기 연산자 (##)는 두 개의 매개 변수를 병합합니다. 그것은 두 개의 독립적 인 매크로 정의 태그는 태그에 결합 할 수 있습니다. 예를 들면 :
#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
token34 = 40
이 예는 컴파일러에서 다음 실제 출력을 생성 있기 때문에, 무슨 일이 있었 방법은 다음과 같습니다
printf ("token34 = %d", token34);
이 예는 토큰을 보여 ## N 여기에 token34에 연결, 우리는문자열 상수 양자화 연산자 (#) 토큰 붙여 넣기 연산자 (##)를 사용.
정의 () 연산자
정의 처리기 오퍼레이터 식별자는 #DEFINE를 사용하여 정의되었는지 여부를 결정하는데 사용되는 정수 표현에 사용된다.지정된 식별자가 이미 정의되어있는 경우, 그 값은 0이 아닌 사실이다. 지정된 식별자가 정의되지 않은 경우, 값 (제로) 거짓. 다음은 정의 () 연산자 사용을 보여줍니다
#include <stdio.h> #if !defined (MESSAGE) #define MESSAGE "You wish!" #endif int main(void) { printf("Here is the message: %s\n", MESSAGE); return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
Here is the message: You wish!
매개 변수화 된 매크로
CPP 강력한 기능 파라미터 매크로 기능을 시뮬레이션하는데 사용될 수있다. 예를 들어, 다음 코드는 수의 제곱을 계산하는 것입니다 :
int square(int x) { return x * x; }
다음과 같이 우리는 위의 코드를 다시 작성하는 매크로를 사용할 수 있습니다 :
#define square(x) ((x) * (x))
매개 변수를 사용하여 매크로를 사용하기전에, 당신은의 #define 지시문을 사용해야합니다.매개 변수 목록은 괄호로 묶어야하고, 매크로 이름 바로 뒤에 있어야합니다. 매크로 이름과 왼쪽 괄호 사이의 공간은 허용되지 않습니다. 예를 들면 :
#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("Max between 20 and 10 is %d\n", MAX(10, 20)); return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를
Max between 20 and 10 is 20