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);
으로 대 체 됩 니 다. 출력 결과: 143 > 계산 결과 도 괄호 로 묶 는 것 이 좋다
다음은 매크로 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();
이것 이 야 말로 우리 가 원 하 는 결과 이다.
주: 본 고 는 이명 걸 선생님 의 박문 에서 옮 겨 졌 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.