C 宏 이 완전히 전개 되 지 않 은 경우

1749 단어 c
더 읽 기
매크로 가 완전히 전개 되 지 않 은 상황 을 만 났 다.
#include 
#include 

/* Use printf inside the definition */
#define PRINTF(fmt, args...)    do { printf(fmt, ##args); } while (0)

/* Make printf represent as the encapsulated print */
#define printf PRINTF

int main(int argc, char* *argv) {
    int p = 100;
    printf("p = %d
", *p); return EXIT_SUCCESS; }

 PRINTF 에 printf 라 는 이름 을 사 용 했 습 니 다.그리고 printf 를 표준 이름 으로 하여 실제 봉 인 된 PRINTF 를 가리 키 려 고 합 니 다.
결 과 는 PRINTF 함수 가 정의 되 지 않 은 경우 가 발생 합 니 다.
 
원인 을 분석 해 보면
     1. 매크로 가 열 렸 을 때 프 리 프로세서 가 printf 를 만 나 최근 설명 에 따라 실 행 됩 니 다.PRINTF 를 사용 할 수 있 음 을 발견, (1 층 전개)
     2. 그러나 PRINTF 를 펼 치 려 고 할 때 PRINTF 의 정 의 는 printf 를 포함 하고 있 으 며, 2 층 전 개 를 허용 할 경우.이 허용 되 는 논리 에 따라 3 층 전 개 를 실행 해 야 합 니 다.이렇게 하면 사 순환 이 되 기 때문에 중단 합 니 다.(2 층 전개 중지)
 
가장 안쪽 의 매크로 정 의 를 바 꾸 면 정상적으로 실행 할 수 있 습 니 다.
#include 
#include 
#include 

int printf2(char const *fmt, ...) {
    int n = 0;
    va_list args;
    va_start(args, fmt);
    n = vprintf(fmt, args);
    va_end(args);
    return n;
}

/* Use printf inside the definition */
#define PRINTF(fmt, args...)    do { printf2(fmt, ##args); } while (0)

/* Make printf represent as the encapsulated print */
#define printf PRINTF

int main(int argc, char* *argv) {
    int p = 100;
    printf("p = %d
", p); return EXIT_SUCCESS; }

 

좋은 웹페이지 즐겨찾기