C 언어 매크로 정의 사용 분석

1.매크로 정의 의'매크로 이름'과'매크로 문자열'을 어떻게 구분 합 니까?인자 가 있 는 매크로 에 대해 서 는 무엇 을 주의해 야 합 니까?
매크로 정의 에서'매크로 이름'과'매크로 문자열'은'빈 칸'을 통 해 구분 된다.컴 파 일 러 가 매크로 정 의 를 처리 할 때 먼저'\#define'다음 빈 칸 에서 문자열 을 읽 기 시작 합 니 다.다음 빈 칸 을 만 날 때 까지 두 빈 칸 사이 의 문자열 은'매크로 이름'입 니 다.'매크로 이름'을 확인 한 후에 이 줄 의 모든 다른 문자열 은'매크로 문자열'입 니 다.그림:\#define+N 개의 빈 칸(1'매개 변수 매크로'에 대해 매크로 이름과'()'사이 에 빈 칸 이 있어 서 는 안 됩 니 다.그렇지 않 으 면'매개 변수 매크로'가 됩 니 다.(위의 원칙 에 따라)또한'매개 변수 없 는 매크로'와'매개 변수 매크로'의 이름 이 같 을 때'매개 변수 없 는 매크로'는'매개 변수 매크로'를 차단 하고'매개 변수 매크로'로 호출 하 더 라 도 통 하지 않 습 니 다.
시험 내용 및 결과:

실험 분석:
보 실 수 있 습 니 다. 3.1415'와'\#define P I 689'는 각각 두 개의 서로 다른 매크로 정의 인'PI'와'P'이다.'G(4)"(X)(2*X)(4)"로 교체 되 었 습 니 다."F(4)"를 호출 했 을 때 시스템 은"2*4"로 교체 되 지 않 고"123(4)"로 교체 되 어"\#define F"를 설명 합 니 다. 123"완전 차단"\#define F(X) (2*X)",주석 이 떨 어 지면"\#define F  123"후"\#define F(X) (2*X)"정상적으로 일 할 수 있다.따라서 매크로 정 의 를 할 때 빈 칸 의 영향 을 예의 주시 하고'매개 변수 매크로'와'매개 변수 매크로 없 음'의 이름 이 같 지 않 으 면 혼 란 스 러 울 수 있 습 니 다.그러나 매크로 호출 시 빈 칸 은 효과 에 영향 을 주지 않 습 니 다.예 를 들 어 F(3)와 F(3)효과 가 같 습 니 다(F(X)는 매개 변수 매크로 입 니 다).
2.매크로 와 함 수 는 사용 방식 과 효과 에 있어 어떤 차이 가 있 습 니까?
매크로 를 정의 할 때 괄호 를 이용 하여 변 수 를 밀봉 하고 모든 매개 변 수 를 묶 어서 우선 순위 와 관련 된 문제 가 발생 하지 않도록 해 야 합 니 다.매크로 가 더 복잡 한 표현 식 에 사 용 될 때 문제 가 발생 하지 않도록 전체 결과 표현 식 도 묶 어야 합 니 다.매크로 의 신뢰성 을 최대한 높 여 라.예 를 들 어'\#define ABS(x) (((x) > 0) ? (x):(-x)'의 신뢰성 은'\#define ABS(x)보다 훨씬 높다. x > 0 ? x:-x",ABS(a-b)로 시험 할 수 있 습 니 다.
매크로 호출 시 자가 증가(+)또는 자가 감소(-)연산 자가 있 으 면 부작용 이 발생 할 수 있 으 므 로 주의해 야 합 니 다.매크로 가 교체 할 때 변수 가 여러 번 나타 나 면 자체 증가 또는 자체 감소 작업 이 여러 번 들 어간 것 과 같 습 니 다.이것 은 함수 호출 과 완전히 다 릅 니 다.함수 호출 중 형 파 라 메 트릭 은 실제 인삼 의 수 치 를 복사 하고 형 삼 을 조작 하 는 데 영향 을 주지 않 습 니 다.매크로 호출 은 직접 여러 번 실제 인삼 을 수정 합 니 다.a=5;"ABS(a++)"가 펼 쳐 지면"(a++)>0 이 됩 니까?(a++):(-a++)","작업 이 끝 난 후"a=7"은"a=6"이 아 닙 니 다.함수 로 쓰 면 이 문 제 를 전혀 걱정 할 필요 가 없다.
매크로 호출 시 다 중 내장 호출 을 진행 하면 매크로 가 펼 쳐 지면 매우 큰 표현 식 이 생 길 수 있 고 상당히 복잡 합 니 다.함수 호출 은 이런 상황 이 발생 하지 않 습 니 다.
3.매크로 와 형식 정의 typedef 의 차이
매크로 의 본질은 교체 이기 때문에 변수 유형 을 한 층 포장 할 수 있 습 니 다.이 패 키 지 를 이용 하여 변 수 를 정의 할 수 있 습 니 다.이렇게 하 는 장점 은 이식 성 을 증가 하 는 것 입 니 다.수정 할 때 매크로 정 의 를 바 꾸 면 됩 니 다.예 를 들 어
 
MY_TYPE a;
MY_TYPE b,c,d;
그러나 이렇게 사용 하지 않 는 것 이 좋 습 니 다.왜냐하면 우 리 는 type:def 가 있 기 때문에 유형 정 의 를 전문 적 으로 하 는 것 입 니 다.그리고 유형 정 의 를 사용 하면 코드 를 더욱 통용 시 켜 심층 적 인 문 제 를 피 할 수 있다.예 를 들 어
 
typedef uint_8 * MY_TYPE2

MY_TYPE1 a,b;
MY_TYPE2 c,d;
분석:
개념 적 으로 보면 MYTYPE 1 과 MYTYPE 2 는 똑 같 습 니 다.모두 uint 를 가리 키 고 있 습 니 다.8 의 지침 이지 만 우리 가 여러 변 수 를 설명 할 때 문제 가 생 겼 다.그것들 은 각각 다음 과 같이 확장 되 었 다.
 
uint_8 *a,b;
MY_TYPE2 c,d; // MY_TYPE2
두 개의 포인터 변수 a,b 를 정의 하려 고 했 는데,지금 은 포인터 변수 a 와 전체 변수 b 가 되 었 습 니 다.이것 은 우리 가 원 하 는 것 이 아 닙 니 다.그리고 MYTYPE 2 자체 가 하나의 유형(사용자 정의)이기 때문에 c,d 는 모두 포인터 유형 으로 기대 에 부합 합 니 다.따라서 유형 을 정의 하려 면'typedef'를 과감하게 선택 하고 매크로 정 의 를 포기 하지 않 으 면 손 해 를 보 는 것 은 자신 입 니 다.

좋은 웹페이지 즐겨찾기