C 학습 - 예비 처리 명령 - 매크로 정의, 파일 포함, 조건 컴 파일 (6)

10614 단어 c
전처리 명령 안내
1. C 언어 는 원본 프로그램 을 컴 파일 하기 전에 특수 한 에 대해 설명 (예 를 들 어 이전에 사 용 했 던 \ # include 파일 에 명령 포함) 하고 새로운 원본 프로그램 (이 과정 을 이 라 고 함) 을 만 든 다음 에 일반적인 컴 파일 을 한다.
2. 예비 처리 명령 과 일반적인 C 문 구 를 구분 하기 위해 모든 예비 처리 명령 은 기호 '#' 으로 시작 하고 3. 예비 처리 명령 은 프로그램의 모든 위치 에 나타 날 수 있 고 그 역할 범 위 는 그 가 나타 난 위치 에서 파일 의 끝 까지 이다.습관 적 으로 우 리 는 가능 한 한 예비 처리 명령 을 소스 프로그램 시작 에 쓴다. 이런 상황 에서 그 역할 범 위 는 전체 소스 파일 이다.
4. C 언어 가 제공 하 는 예비 처리 명령 은 주로 、 、 이다.
이 강 의 는 먼저 매크로 정 의 를 소개 하고 은 2 가지 로 나 눌 수 있다. 이다.
매크로 정의
1. 매개 변수 가 없 는 매크로 정의
1.1 일반 형식#define
ABC 10
오른쪽 문자열 도 생략 할 수 있 습 니 다. 예 를 들 어 \ # define ABC
1.2 작용
사전 처 리 를 컴 파일 할 때 원본 프로그램의 모든 '매크로 이름' 을 오른쪽 '문자열' 로 바 꾸 는 역할 을 합 니 다. .
다음은 프로그램 을 써 서 원 의 반지름 에 따라 둘레 를 계산한다.
1 #include 
 2 
 3 //          PI            3.14   
 4 #define PI 3.14
 5 
 6 //        radius   
 7 float girth(float radius) {
 8     return 2 * PI *radius;
 9 }
10 
11 int main ()
12 {
13     float g = girth(2);
14     
15     printf("   :%f", g);
16     return 0;
17 }

네 번 째 줄 에 PI 라 는 매크로 를 정의 합 니 다. 컴 파일 예비 처리 후 8 줄 에 있 는 2 PI radius 는 2 3.14 radius 가 됩 니 다.
출력 결과:
1.3 사용 습관 과 주의
1 > 매크로 이름 은 일반적으로 대문자 로 변수 이름과 구별 할 수 있 지만 소문 자로 도 문법 오류 가 없습니다.
2 > 프로그램 에서 두 따옴표 로 확 대 된 문자열 의 문 자 를 매크로 로 바 꾸 지 않 습 니 다.예 를 들 면:
1 #define R 10
2 int main ()
3 {
4     char *s = "Radio";
5     return 0;
6 }

첫 번 째 줄 에 R 이라는 매크로 를 정 의 했 지만 네 번 째 줄 에 있 는 'Radio' 의 'R' 은 10 으로 바 뀌 지 않 습 니 다.
3 > 미리 처 리 된 문자열 로 매크로 이름 을 바 꿀 때 문법 검 사 를 하지 않 고 간단 한 문자열 로 바 꿉 니 다.컴 파일 할 때 만 매크로 이름 이 열 린 원본 프로그램 에 대해 문법 검 사 를 할 수 있 습 니 다.
1 #define I 100
2 int main ()
3 {
4     int i[3] = I;
5     return 0;
6 }

컴 파일 예비 처 리 를 할 때 문법 이 맞 든 안 맞 든 네 번 째 줄 의 I 는 100 으로 바뀐다.하지만 컴 파일 할 때 네 번 째 줄 의 잘못 을 보고 합 니 다.
4> 。매크로 정의 역할 영역 을 종료 하려 면 #undef 명령 을 사용 할 수 있 습 니 다.
1 #define PI 3.14
2 /*
3 .
4 .
5 .
6 .
7 */
8 #undef PI

PI 이 매크로 는 첫 번 째 줄 에서 여덟 번 째 줄 사이 에 유효 합 니 다. 여덟 번 째 줄 이후 에는 유효 하지 않 습 니 다.
5 > 매크로 를 정의 할 때 정 의 된 매크로 이름 을 참조 할 수 있 습 니 다.
#define R  3.0
#define PI 3.14
#define L  2*PI*R
#define S  PI*R*R

2. 매개 변수 가 있 는 매크로 정의
2.1 일반 형식#define ( )
2.2 역할
사전 처 리 를 컴 파일 할 때 원본 프로그램의 모든 매크로 이름 을 문자열 로 바 꾸 고 문자열 의 인 자 를 매크로 이름 오른쪽 매개 변수 목록 의 인자 로 바 꿉 니 다.
 1 #include 
 2 
 3 #define average(a, b) (a+b)/2
 4 
 5 int main ()
 6 {
 7     int a = average(10, 4);
 8     
 9     printf("   :%d", a);
10     return 0;
11 }

세 번 째 줄 에서 두 개의 인 자 를 가 진 매크로 average 를 정 의 했 습 니 다. 일곱 번 째 줄 은 int a = (10 + 4) / 2 로 대 체 됩 니 다.출력 결 과 는 다음 과 같 습 니 다.이 매크로 가 약간 함수 같 지 않 아 요?
2.3 사용 주의
1 #define average (a, b) (a+b)/2
2 
3 int main ()
4 {
5     int a = average(10, 4);
6     return 0;
7 }

첫 번 째 줄 의 매크로 정 의 를 주의 하 십시오. 매크로 이름 average 와 (a, b) 사이 에 빈 칸 이 있 기 때문에 다섯 번 째 줄 은 이렇게 됩 니 다.
int a = (a, b) (a+b)/2(10, 4);

이것 은 틀림없이 컴 파일 이 통과 되 지 않 을 것 이다.
2 > 매개 변 수 를 가 진 매크로 가 펼 쳐 질 때 간단 한 문자 와 매개 변 수 를 바 꾸 고 계산 작업 을 하지 않 습 니 다.따라서 매크로 를 정의 할 때 문자열 의 인 자 를 작은 괄호 로 묶 습 니 다.
다음은 매크로 D (a) 를 정의 합 니 다. 역할 은 a 의 2 배 수 치 를 되 돌려 줍 니 다.
  • 매크로 를 정의 할 때 소괄호 괄호 포함 매개 변수
  •  1 #include 
     2 
     3 #define D(a) 2*a
     4 
     5 int main ()
     6 {
     7     int b = D(3+4);
     8     
     9     printf("%d", b);
    10     return 0;
    11 }

    7 번 째 줄 은 int b = 2*3+4; 으로 대 체 됩 니 다. 출력 결과: 10
    매크로 를 정의 할 때 작은 괄호 로 파 라 메 터 를 묶 으 면 위의 세 번 째 줄 을 다음 과 같이 바 꿉 니 다.
    #define D(a) 2*(a)

    오른쪽 에 있 는 a 는 괄호 가 있 습 니 다. 7 줄 은 int b = 2*(3+4); 으로 대 체 됩 니 다. 출력 결과: 14
    3 > 계산 결과 도 괄호 로 묶 는 것 이 좋다
    다음은 매크로 P (a) 를 정의 합 니 다. 역할 은 a 의 제곱 을 되 돌려 주 는 것 입 니 다.
  • 만약 소괄호 가 계산 결 과 를 묶는다 면
  •  1 #include 
     2 
     3 #define Pow(a) (a) * (a)
     4 
     5 int main(int argc, const char * argv[]) {
     6     int b = Pow(10) / Pow(2);
     7     
     8     printf("%d", b);
     9     return 0;
    10 }

    세 번 째 줄 에 주의 하 세 요. 작은 괄호 로 계산 결 과 를 확대 하지 않 고 매개 변수 만 묶 었 을 뿐 입 니 다.여섯 번 째 줄 코드 가 바 뀌 었 습 니 다:
    int b = (10) * (10) / (2) * (2);

    간소화 후: int b = 10 (10 / 2) 2;,마지막 변수 b: 100
  • 위 에 있 는 세 번 째 줄 코드 를 으로 바 꾸 면
  • #define Pow(a) ( (a) * (a) )

    그러면 여섯 번 째 줄 은 다음 과 같 습 니 다.
    int b = ( (10) * (10) ) / ( (2) * (2) );

    간소화 후: int b = (10 * 10) / (2 * 2);, 최종 출력 결과: 25.이것 이 야 말로 우리 가 원 하 는 결과 다.
    앞의 #define average(a, b) (a+b)/2#define average(a, b) (((a)+(b))/2) 으로 써 야 한 다 는 뜻 입 니 다.
    2.5 와 함수 의 차이
    전체 사용 과정 에서 파 라 메 터 를 가 진 매크로 정 의 는 소스 프로그램 에서 나타 나 는 형식 과 함수 가 매우 비슷 하 다 는 것 을 알 수 있다.그러나 둘 은 본질 적 인 차이 가 있다.
    1 > 매크로 정 의 는 저장 공간의 분배, 매개 변수 유형 일치, 매개 변수 전달, 반환 값 문제 와 관련 되 지 않 습 니 다.
    2 > 함수 호출 은 프로그램 이 실 행 될 때 실 행 됩 니 다. 매크로 교 체 는 컴 파일 예비 처리 단계 에서 만 실 행 됩 니 다.그래서 매개 변 수 를 가 진 매크로 는 함수 보다 더 높 은 실행 효율 을 가진다.
    2. 조건 컴 파일
    조건 부 컴 파일 개념
    많은 경우 , ( ), .
    1. 기본 용법
    #if   1
     ...code1...
    #elif   2
     ...code2...
    #else
     ...code3...
    #endif

    1 > 조건 1 이 성립 되면 컴 파일 러 는 #if#elif 사이 의 code 1 코드 를 ( : , , if-else ) 에 컴 파일 합 니 다.
    2 > 조건 1 이 성립 되 지 않 고 조건 2 가 성립 되면 컴 파일 러 는 \ # elif 와 \ # else 사이 의 code 2 코드 를 컴 파일 합 니 다.
    3 > 조건 1, 2 가 성립 되 지 않 으 면 컴 파일 러 는 \ # else 와 \ # endif 사이 의 code 3 를 컴 파일 합 니 다.
    4> , , #endif, ( )
    5 > #if#elif 뒤의 조건 은 보통 이 고 이다. 조건 컴 파일 은 컴 파일 하기 전에 판단 한 것 이기 때문에 , 、 이다.
    2. 예 를 들 어
     1 #include 
     2 
     3 #define MAX 11
     4 
     5 int main ()
     6 {
     7 #if MAX == 0
     8     printf("MAX 0");
     9 #elif MAX > 0
    10     printf("MAX  0");
    11 #else
    12     printf("MAX  0");
    13 #endif
    14     return 0;
    15 }

    세 번 째 줄 에서 매크로 맥 스 를 정 의 했 습 니 다. 물론 개발 중 에 이 맥 스 는 다른 헤더 파일 에 정 의 될 수 있 습 니 다. 지금 은 프 리 젠 테 이 션 을 편리 하 게 하기 위해 main 함수 에 썼 습 니 다.7 번 부터 13 번 째 줄 까지 의 조건 컴 파일 문 구 를 주의 하 십시오.MAX 가 11 이기 때문에 \ # elif 의 조건 이 성립 되 고 10 줄 코드 가 컴 파일 됩 니 다. 사실은 컴 파일 된 예비 처리 후의 코드 는 다음 과 같 습 니 다.
    /*stdio.h          #include    */
    
    int main ()
    {
        printf("MAX  0");
        return 0;
    }

    코드 가 매우 간결 해 졌 습 니 다. 출력 결과:
    3. 기타 용법
    3.1 \ # if defined() 과 \ # if !defined() 의 용법#if#elif 뒤의 조건 은 매크로 의 값 을 판단 할 수 있 을 뿐만 아니 라 도 판단 할 수 있다.예 를 들 면:
    1 #if defined(MAX)
    2     ...code...
    3 #endif

    앞 에 에서 MAX 라 는 매크로 를 정의 한 적 이 있다 면 code 를 컴 파일 합 니 다. MAX , MAX,
    조건 도 반대 할 수 있다.
    1 #if !defined(MAX)
    2     ...code...
    3 #endif

    앞 에 에서 MAX 라 는 매크로 를 정의 한 적 이 있다 면 code 를 컴 파일 합 니 다.
    3.2 #ifdef#ifndef 의 사용
  • #ifdef 의 사용 과 #if defined() 의 용법 은 기본적으로 일치 하 다
  • 1 #ifdef MAX
    2     ...code...
    3 #endif

    앞 에 에서 MAX 라 는 매크로 를 정의 한 적 이 있다 면 code 를 컴 파일 합 니 다.#ifndef#if !defined() 의 용법 은 기본적으로 일치한다.
    1 #ifndef MAX
    2     ...code...
    3 #endif

    앞에서 MAX 라 는 매크로 를 정의 하지 않 았 다 면 code 를 컴 파일 합 니 다.
    3. 파일 포함
    1. 개념
    사실 우 리 는 이미 접촉 파일 에 이 명령 을 포함 하고 있 었 다. 바로 #include 이다. 그것 은 한 파일 의 모든 내용 을 다른 파일 에 담 을 수 있다.
    2. 일반 형식
    2.1 제1 종 형식 #include C 언어 라 이브 러 리 함수 헤더 파일 이 있 는 디 렉 터 리 에서 파일 찾기
    2.2 두 번 째 형식 #include " "시스템 은 원본 프로그램의 현재 디 렉 터 리 에서 먼저 찾 습 니 다. 찾 지 못 하면 운영 체제 path 경로 에서 찾 습 니 다. 마지막 으로 C 언어 라 이브 러 리 함수 헤더 파일 이 있 는 디 렉 터 리 에서 찾 습 니 다.
    3. 사용 주의
    1. \ # include 명령 내장 포함, 예 를 들 어 a. h 는 b. h, b. h 는 c. h 를 포함 하지만 재 귀 는 a. h 는 b. h, b. h 는 a. h 를 포함 합 니 다.
    다음 방법 은 입 니 다.
    2. \ # include 명령 을 사용 하면 같은 헤더 파일 을 여러 번 포함 하고 컴 파일 효율 을 낮 출 수 있 습 니 다. 예 를 들 어 아래 의 상황:
    원. h 에서 원 함 수 를 설명 합 니 다.투. h 에 원. h 가 포함 되 어 있 고 투 함수 도 설명 되 어 있 습 니 다.(여기 서 함수 의 실현, 즉 함수 의 정 의 를 쓰 지 않 습 니 다)
    만약 에 제 가 main.c 에서 one 과 two 두 개의 함 수 를 사용 하고 싶 습 니 다. 그리고 가끔 우 리 는 to. h 에 one. h 가 포함 되 어 있다 는 것 을 모 르 기 때문에 이렇게 할 수 있 습 니 다. main.c 의 코드 는 다음 과 같 습 니 다.
    1 void one();
    2 void one();
    3 void two();
    4 int main ()
    5 {
    6 
    7     return 0;
    8 }

    첫 번 째 줄 은 \ # include "one. h" 로 인 한 것 이 고, 두 번 째 줄 은 \ # include "to. h" 로 인 한 것 이다 (to. h 에 one. h 가 포함 되 어 있 기 때문이다).원 함수 가 두 번 성명 되 었 음 을 알 수 있 습 니 다. 필요 없습니다. 그러면 컴 파일 효율 이 떨 어 집 니 다.
    같은 헤더 파일 을 반복 적 으로 포함 하 는 문 제 를 해결 하기 위해 서 는 보통 헤더 파일 내용 을 이렇게 씁 니 다.
    뜻 을 대충 설명 하고 원. h 를 예 로 들 자. 우리 가 처음 \ # include "원. h" 를 만 들 었 을 때 정의 가 없 었 기 때문이다.ONE_H_,그래서 9 줄 의 조건 이 성립 되 었 고, 이어서 10 줄 에서 정의 되 었 다ONE_H_이 매크로 는 13 줄 에서 one 함 수 를 설명 하고 마지막 으로 15 줄 에서 조건 컴 파일 을 끝 냅 니 다.두 번 째 \ # include "one. h" 가 정의 되 었 기 때문에ONE_H_이 매크로 는 9 줄 의 조건 이 성립 되 지 않 습 니 다. 15 줄 의 \ # endif 로 바로 이동 하여 조건 컴 파일 을 끝 냅 니 다.이렇게 간단 한 세 마디 코드 로 원. h 의 내용 이 중복 되 는 것 을 방지 합 니 다.
    이렇게 되면 main. c 의:
    #include "one.h"
    #include "two.h"

    이렇게 됩 니 다.
     1 // #include "one.h"
     2 #ifndef _ONE_H_
     3 #define _ONE_H_
     4 
     5 void one();
     6 
     7 #endif
     8 
     9 // #include "two.h"
    10 #ifndef _TWO_H_
    11 #define _TWO_H_
    12 
    13 // #include "one.h"
    14 #ifndef _ONE_H_
    15 #define _ONE_H_
    16 
    17 void one();
    18 
    19 #endif
    20 
    21 void two();
    22 
    23 #endif

    2 ~ 7 행 은 \ # include "one. h" 로 인 한 것 이 고, 10 ~ 23 행 은 \ # include "to. h" 로 인 한 것 이다.사전 처 리 를 컴 파일 한 후:
    1 void one();
    2 void two();

    이것 이 야 말로 우리 가 원 하 는 결과 이다.
    주: 본 고 는 이명 걸 선생님 의 박문 에서 옮 겨 졌 다.

    좋은 웹페이지 즐겨찾기