C 언어에는 매개변수 매크로 정의가 없습니다.
매크로로 정의된 식별자를 매크로 이름이라고 합니다.사전 프로세싱을 컴파일할 때 프로그램에 나타나는 모든 매크로 이름은 매크로 정의의 문자열로 대치됩니다. 이를 매크로 대치 또는 매크로 확장이라고 합니다.
매크로 정의는 원본 프로그램의 매크로 정의 명령에 의해 완성됩니다.매크로 교체는 사전 처리 프로그램이 자동으로 완성한 것이다.
C 언어에서 매크로는 매개변수 있음 및 매개변수 없음 두 가지로 구분됩니다.
이 섹션에서는 매개 변수가 없는 매크로에 대해 설명합니다.
매크로 정의 없음
매크로가 없는 매크로 이름 뒤에 매개변수가 없습니다.일반적인 정의는 다음과 같습니다.
#define 식별자 문자열
여기서 # 은 사전 처리 명령임을 나타냅니다."#"로 시작하는 모든 명령은 사전 처리 명령입니다.'define' 은 매크로에 대한 명령을 정의합니다.식별자는 정의된 매크로 이름입니다.문자열은 상수, 표현식, 형식 문자열 등이 될 수 있습니다.
앞에서 설명한 기호 상수의 정의는 무참홍 정의이다.그 밖에 프로그램에서 반복적으로 사용하는 표현식에 대해 매크로 정의를 한다.예를 들면 다음과 같습니다.
#define M (y*y+3*y)
표현식(y*y+3*y) 대신 식별자 M을 지정하는 역할을 합니다.원본 프로그램을 작성할 때 모든 (y*y+3*y) 는 M으로 대체할 수 있고, 원본 프로그램을 컴파일할 때, 먼저 예처리 프로그램에서 매크로 대체할 수 있다. 즉 (y*y+3*y) 표현식으로 모든 매크로 이름 M을 바꾸고 다시 컴파일할 수 있다.
[예9-1]
#include
#define M (y*y+3*y)
int main(void){
int s,y;
printf("input a number: ");
scanf("%d",&y);
s=3*M+4*M+5*M;
printf("s=%d",s);
return 0;
}
상례 프로그램에서 먼저 매크로 정의를 하고 M을 정의하여 표현식(y*y+3*y)을 대체하고 s=3*M+4*M+5*M에서 매크로 호출을 했다.미리 처리할 때 매크로를 확장하면 다음과 같이 문장이 바뀝니다.
s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);
그러나 매크로 정의에서 표현식(y*y+3*y) 양쪽의 괄호가 적으면 안 된다는 점에 주의해야 한다.그렇지 않으면 오류가 발생할 수 있습니다.
다음과 같이 정의된 경우
#difine M y*y+3*y
매크로를 확장하면 다음과 같은 문이 나타납니다.
s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;
이는 다음과 같습니다.
3y
2
+3y+4y
2
+3y+5y
2
+3y
분명히 원제의 요구와 일치하지 않는다.계산 결과는 당연히 잘못된 것이다.따라서 매크로 정의를 할 때 반드시 주의해야 한다.매크로가 바뀐 후에 오류가 발생하지 않도록 보증해야 한다.
매크로 정의에 대해서는 다음 사항도 설명합니다.
1) 매크로 정의는 매크로 이름으로 문자열을 나타내고 매크로가 확장될 때 매크로 이름 대신 문자열을 나타냅니다.
이것은 단지 간단한 교체일 뿐,
문자열에는 상수일 수도 있고 표현식일 수도 있으며, 사전 처리 프로그램은 그것에 대해 아무런 검사도 하지 않는다.오류가 있으면 매크로가 확장된 원본 프로그램을 컴파일할 때만 발견할 수 있습니다.
2) 매크로 정의는 설명 또는 문이 아닙니다.
행말에 점수를 붙일 필요가 없고,
분호를 더하면 분호까지 함께 바꾼다.
3) 매크로 정의는 함수 외부에 써야 하며 매크로 정의 명령은 원본 프로그램의 끝으로 작용한다.역할 영역을 종료하려면
#undef 명령
.예를 들면 다음과 같습니다.
#define PI 3.14159
int main(void){
return 0;
}
#undef PI
f1(){
}
PI는main 함수에서만 유효하고 f1에서는 유효하지 않음을 나타낸다.
4) 매크로 이름이 소스 프로그램에서 따옴표로 묶이면 사전 처리 프로그램이 매크로 대치하지 않습니다.아래와 같이 [예92]:
#include
#define OK 100
int main(void){
printf("OK");
printf("
");
return 0;
}
전례에서 매크로 이름 OK는 100을 표시하지만 printf 문장에서 OK는 인용부호로 묶여 매크로 교체가 되지 않습니다.프로그램의 실행 결과는 다음과 같습니다: OK. 이것은 'OK' 를 문자열로 처리하는 것을 의미합니다.
5) 매크로 정의는 매크로 정의 문자열에 이미 정의된 매크로 이름을 사용할 수 있도록 중첩할 수 있습니다.매크로를 펼칠 때 미리 처리 프로그램이 층층이 교체됩니다.예를 들면 다음과 같습니다.
#define PI 3.1415926
#define S PI*y*y
명령문:
printf("%f",S);
매크로 교체 후 다음이 됩니다.
printf("%f",3.1415926*y*y);
6) 변수와 구별하기 편리하도록 매크로 이름을 대문자로 표시하는 습관이 있다.소문자도 허용된다.
7) 데이터 유형을 매크로 정의로 표시하여 쓰기 쉽도록 할 수 있습니다.예를 들면 다음과 같습니다.
#define STU struct stu
프로그램에서 STU를 변수 설명으로 사용할 수 있습니다.
STU body[5],*p;
#define INTEGER int
INTEGER를 사용하여 프로그램에서 정수 변수 설명을 수행할 수 있습니다.
INTEGER a,b;
매크로 정의로 데이터 형식을 표시하는 것과 typedef로 데이터 설명자를 정의하는 차이점에 주의해야 한다.
매크로 정의는 간단한 문자열 대체일 뿐, 미리 처리된 것이고, typedef는 컴파일할 때 처리된 것이며, 간단한 대체가 아니라 형식 설명자에 대한 재명명명입니다.명명된 식별자는 유형 정의 설명 기능을 가지고 있다.
다음 예를 참조하십시오.
#define PIN1 int *
typedef (int *) PIN2;
형식적으로는 비슷하지만 실제 사용에서는 다르다.
다음은 PIN1, PIN2를 사용하여 변수의 차이점을 설명합니다.
PIN1 a,b;
매크로 교체 후 다음이 됩니다.
int *a,b;
a는 정형을 가리키는 바늘 변수이고 b는 정형 변수임을 나타낸다.그러나
PIN2 a,b;
a, b는 모두 정형을 가리키는 바늘 변수임을 나타낸다.PIN2는 유형 설명자이기 때문입니다.
이 예에서 알 수 있듯이 매크로 정의는 데이터 형식을 나타낼 수도 있지만 문자 대환을 하기 때문이다.실수를 피하기 위해 사용할 때 유달리 조심해야 한다.
8) 출력 형식을 매크로로 정의하면 쓰기 번거로움을 줄일 수 있다.
[예9-3]에서 이런 방법을 채택하였다.
#include
#define P printf
#define D "%d
"
#define F "%f
"
int main(void){
int a=5, c=8, e=11;
float b=3.8, d=9.7, f=21.08;
P(D F,a,b);
P(D F,c,d);
P(D F,e,f);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.