반응형
매크로 값의 문자열화
문제가 발생했습니다. 매크로 값을 문자열과 정수로 모두 사용해야 합니다.
#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
반응형
'source' 카테고리의 다른 글
vue 소품일 경우 필요합니까? (0) | 2022.08.28 |
---|---|
수정 2.0: 역직렬화된 오류 응답을 얻는 방법.몸 (0) | 2022.08.28 |
VueJS 메서드가 Axios에서 응답을 반환하지 않음 (0) | 2022.08.28 |
C++와 Java의 "일반" 유형의 차이점은 무엇입니까? (0) | 2022.08.28 |
Java: sun.security.provider.certpath.SunCertPathBuilder예외: 요청된 대상에 대한 올바른 인증 경로를 찾을 수 없습니다. (0) | 2022.08.28 |