source

매크로 값의 문자열화

goodcode 2022. 8. 28. 09:37
반응형

매크로 값의 문자열화

문제가 발생했습니다. 매크로 값을 문자열과 정수로 모두 사용해야 합니다.

 #define RECORDS_PER_PAGE 10

 /*... */

 #define REQUEST_RECORDS \
      "SELECT Fields FROM Table WHERE Conditions" \
      " OFFSET %d * " #RECORDS_PER_PAGE \
      " LIMIT " #RECORDS_PER_PAGE ";"

 char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];

 /* ...and some more uses of RECORDS_PER_PAGE, elsewhere... */

이것은 「stray #」라고 하는 메세지와 함께 실패해, 동작해도, 값이 아니고 매크로명이 문자열화 됩니다.물론 최종 메서드에 값을 입력할 수 있습니다("LIMIT %d ", page*RECORDS_PER_PAGE하지만, 예쁘지도 않고 효율적이지도 않습니다.프리프로세서가 문자열을 특별한 방식으로 처리하지 않고 일반 코드처럼 내용을 처리했으면 하는 생각이 들 때가 있습니다.일단은, 나는 그것을 찰싹찰싹 마셨다.#define RECORDS_PER_PAGE_TXT "10"당연하게도 나는 그것에 대해 행복하지 않다.

어떻게 맞혀?

xstr아래에 정의되어 있는 매크로는 매크로 검색 후 문자열화 됩니다.

#define xstr(a) str(a)
#define str(a) #a

#define RECORDS_PER_PAGE 10

#define REQUEST_RECORDS \
    "SELECT Fields FROM Table WHERE Conditions" \
    " OFFSET %d * " xstr(RECORDS_PER_PAGE) \
    " LIMIT " xstr(RECORDS_PER_PAGE) ";"
#include <stdio.h>

#define RECORDS_PER_PAGE 10

#define TEXTIFY(A) #A

#define _REQUEST_RECORDS(OFFSET, LIMIT)                 \
        "SELECT Fields FROM Table WHERE Conditions"     \
        " OFFSET %d * " TEXTIFY(OFFSET)                 \
        " LIMIT " TEXTIFY(LIMIT) ";"

#define REQUEST_RECORDS _REQUEST_RECORDS(RECORDS_PER_PAGE, RECORDS_PER_PAGE)

int main() {
        printf("%s\n", REQUEST_RECORDS);
        return 0;
}

출력:

SELECT Fields FROM Table WHERE Conditions OFFSET %d * 10 LIMIT 10;

인수를 문자열화하기 전에 인수를 평가하기 위해 _REQUEST_RECORD에 대한 방향 지정을 메모합니다.

인용구를 이중으로 이스케이프 해 주세요.

#define RECORDS_PER_PAGE 10
#define MAX_RECORD_LEN 10

 /*... */
#define DOUBLEESCAPE(a) #a
#define ESCAPEQUOTE(a) DOUBLEESCAPE(a)
#define REQUEST_RECORDS \
      "SELECT Fields FROM Table WHERE Conditions" \
      " OFFSET %d * " ESCAPEQUOTE(RECORDS_PER_PAGE)       \
      " LIMIT " ESCAPEQUOTE(RECORDS_PER_PAGE) ";"

 char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];

int main(){
  char * a = REQUEST_RECORDS;
}

컴파일을 해 주세요.토큰RECORDS_PER_PAGE에 의해 확장됩니다.ESCAPEQUOTE매크로 콜이 송신됩니다.DOUBLEESCAPE인용하다

언급URL : https://stackoverflow.com/questions/2653214/stringification-of-a-macro-value

반응형