당신 이 알 아야 할 C 언어 예비 처리 문제 에 대한 상세 한 설명

C 언어 예비 처리 기 는 매크로 교체,조건 컴 파일,파일 포함 을 실행 합 니 다.보통'\#'을 줄 의 첫머리 로 하 는 힌트 를 사용한다.다음은 C 언어 전처리 의 응용 장소 입 니 다.
1.세 글자 단어(Trigraph Sequences)
C 소스 프로그램의 문자 집합 은 7 비트 ASCII 문자 집합 에 포함 되 어 있 지만 ISO 646-1983 Invariant Code Set 의 초 집합 입 니 다.프로그램 이 축소 집합(reduced set)에 나타 날 수 있 도록 아래 의 세 글자 단 어 는 해당 하 는 단일 문자 로 대 체 됩 니 다.
세 글자 단어
단일 문자
??=
#
??/
\
??'
^
??(
[
??)
]
??!
|
??<
{
??>
}
??-
~
교 체 는 다른 처리 전에 발생 한다.
예 를 들 어"what?!"문자열 을 인쇄 하려 고 시도 하면

 printf("what??!
");
문자열'what|'을 얻 을 수 있 습 니 다.
만약 당신 이 이렇게 주석 코드 를 사용한다 면 결 과 는 당신 을 놀 라 게 할 것 입 니 다.

// Will the next line be executed?????????????/
a++;
a++는 실행 되 지 않 을 것 입 니 다.전 제 는 네가 작용 을 알 고 있다 는 것 이다.
메모:ANSI C 에 대한 컴 파일 러 의 지원 이 다 르 기 때문에 일부 컴 파일 러 는 세 글자 단 어 를 일반 문자 로 처리 합 니 다.컴 파일 옵션 에'-trigraphs'를 추가 해 야 합 니 다.
2.줄 맞 추기
역 슬 래 쉬"\"로 끝 나 는 줄 은 이 줄 과 다음 줄 을 한 줄 로 연결 합 니 다.속 행 부 라 고 함]
예 를 들 어 이렇게 쓸 수 있다

/\
* is a legal comment. *\
/
3.매크로 정의 와 전개
a)단순 매크로 교체
간단 한 매크로 교 체 는 프로그램 에서 하나의 식별 자 로 단어 문자열 을 표시 할 수 있 습 니 다.명령 형식 은 다음 과 같 습 니 다.

#define
식별 자(매크로 이름 이 라 고 함)는 뒤의 단어 문자열 로 정의 되 었 습 니 다.단어 문자열(줄 바 꿈)은 줄 바 꿈 으로 끝 나 는 프로그램 에서 이 식별 자 를 바 꾸 는 데 사용 되 는 본문 입 니 다.문자열 이 너무 길 면 여러 줄 로 써 야 한다 면 마지막 줄 을 제외 하고 모든 줄 의 끝 에 속 행 문자 가 있어 야 한다.
메모:문자열 상수 에 나타 나 는 매크로 이름과 같은 문자열 은 바 뀌 는 열 에 없습니다.예 를 들 어

#define YES 1
printf("YES");            // YES, 1
b)매개 변 수 를 가 진 매크로 교체
사전 처리 명령 의 형식 은 다음 과 같다.

#define    ( , ,..., )   
'식별 자(식별 자,식별 자,...,식별 자)'는 정 의 된 매크로 이 고()밖의 식별 자 는 매크로 라 고 부 르 며()중의 식별 자 는 매크로 의 형식 매개 변수 이다.매크로 이름과 뒤의()사이 에 공백 문자 가 있 으 면 안 됩 니 다.
예 를 들 어

#define max(a,b) ((a)>(b)? (a): (b))
♦연산 자\#와\#
연산 자\#그 다음 문자열 을 더 블 따옴표 로 둘 러 싼 문자열 로 바 꿉 니 다.
연산 자\##두 표지 부 호 를 한데 묶 어 새로운 식별 자 를 만 듭 니 다

#define str(expr)    #expr
#define cat(x,y)      x ## y

int ab=12;
printf(str(hello world!));      // printf("hello world!");
printf("ab=%d
", cat(a,b));        // printf("ab=%d
", ab);  ab=12

♦매크로 교체 시의 순서

#include <stdio.h>
 #define f(a,b)  a##b
 #define g(a)   #a
 #define h(a)   g(a)

 int main()
 {
         printf("%s
", h(f(1,2)));
         printf("%s
", g(f(1,2)));
         return 0;
 }
출력 결 과 는 12 와 f(1,2)입 니 다.왜 그 럴 까?매크로 의 풀 기 는 함수 가 아니 라 안에서 밖으로.
(1)"내 매크로 이름 이나 매크로 매개 변수 이름 은 바 뀌 지 않 습 니 다.
(2)매크로 교체 순서:매개 변 수 를 가 진 매크로 내부 에서 다른 매크로 를 호출 합 니 다.매개 변수 도 하나의 매크로 입 니 다.먼저 바깥쪽 의 매크로 를 교체 한 다음 에 바깥쪽 매크로 의 인 자 를 교체 하고 마지막 으로 내부 매크로 를 교체 합 니 다.
이 규칙 들 을 아 는 것 은 위의 결과 가 나타 나 는 것 에 대해 이해 하기 어렵 지 않다.
따뜻 한 알림:매개 변 수 를 가 진 매크로 교체 명령 을 쓸 때 추천 하 는 방법 은 단어 문자열 의 모든 매개 변 수 를()로 묶 고 전체 표현 식 도()으로 묶 어야 합 니 다.그렇지 않 으 면 교체 결 과 는 당신 이 원 하 는 것 이 아 닐 수도 있 습 니 다.예 를 들 어

#define sqr(x)    x * x
//
sqr(3.0+1.0);                // 3.0 + 1.0 * 3.0 + 1.0
결 과 는 당신 의 원래 뜻(3.0+1.0)*(3.0+1.0)과 같 지 않 습 니 다.
c)매크로 정의 취소

#undef
는 매크로 식별 자 를 정의 하지 못 하 게 합 니 다.정의 되 지 않 은 식별 자  잘못 되 지 않 을 겁 니 다.
4.파일 포함

#include <filename>     // ( )
#include "filename"       // ( )
#include             // #define <filename> "filename"
5.조건 컴 파일
조건 컴 파일 명령 형식 은 다음 과 같 습 니 다.

if-line
[#elif ]
...
[#else ]
#endif

if-line 은 아래 의 임의의 형식 입 니 다.
(1)\#if 상수 표현 식
(2)\#ifdef 식별 자
(3)\#ifndef 식별 자
  ♦defined 연산 자 는 식별 자가 정의 되 었 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다.형식 은 다음 과 같다.
  defined identifier
혹시
  defined (identifier)
하부의
  #ifdef identifier
  #ifndef identifier
등가
  #if defined identifier
  #if ! defined identifier
6.줄 제어
행 제어 명령 은 다음 과 같은 두 가지 형식 이 있다.
  (1)#line n "filename"
  (2)#line n
줄 제어 예비 처리 기능 은 다른 C 소스 프로그램 을 만 드 는 예비 처리 프로그램(예 를 들 어 데이터베이스 시스템 의 숙주 C 예비 컴 파일 러)이 피 처리 프로그램(예 를 들 어 숙주 C 예비 컴 파일 러 에 의 해 처 리 된 확장 자 는.pc 의 예비 컴 파일 러)의 줄 번 호 를 추적 할 때 편 의 를 제공 하여 최종 사용자 의 소스 프로그램 오류 와 이 오 류 를 쉽게 찾 을 수 있 습 니 다.이것 은 컴 파 일 러 로 하여 금 n(10 진수 정수)을 다음 원본 프로그램의 줄 번호 로 믿 게 하고,"filename"은 현재 파일 이름 으로 여 겨 집 니 다.
7.생 성 오류
  #error error_messageopt
컴 파 일 러 로 하여 금 오류 정 보 를 출력 하 게 하 는 errormessage
  8.Pragmas
  #pragma token-sequenceopt
\#pragma 는 컴 파일 러 가 실 현 될 때 정 의 된 명령 으로 컴 파일 러 에 각종 명령 을 전달 할 수 있 습 니 다.예 를 들 어 하나의 컴 파일 러 는 추적 프로그램의 실행 을 지원 하 는 옵션 을 가 질 수 있 습 니 다.이 때\#pragma 문 구 를 사용 하여 이 기능 을 선택 할 수 있 습 니 다.컴 파일 러 는 지원 하지 않 는\#pragma 옵션 을 무시 합 니 다.\#pragma 는 C 소스 프로그램 이 컴 파일 러 에 대한 이식 성 을 향상 시킨다.
9.빈 명령
마치
  #
아무 소 용이 없다
10.미리 정 의 된 매크로
C 언어 는 다섯 개의 고유 한 미리 정 의 된 매크로 를 규범화 시 켰 는데 그들 은 각각
  __LINE__현재 원본 프로그램의 줄 번호
  __FILE__컴 파일 중인 프로그램의 파일 이름
  __DATE__"Mmm dd yy"와 같은 날짜 문자열 을 컴 파일 합 니 다.
  __TIME__'hh:mm:ss'와 같은 시간 문자열 을 컴 파일 합 니 다.
  __STDC__하면,만약,만약...STDC__의 내용 은 10 진 상수 1 로 컴 파일 러 의 실현 이 표준 C 에 부합 함 을 나타 낸다.

좋은 웹페이지 즐겨찾기