당신 이 알 아야 할 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 에 부합 함 을 나타 낸다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.