2010-04-16 5 views
20

문제가 생겼습니다 - 매크로 값을 문자열과 정수로 사용해야합니다.매크로 값의 문자열 화

#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... */ 

이 "길 잃은 #"에 대한 메시지와 함께 실패하고 일을해도, 내가 매크로 이름, 값을되지도 캐릭터 라인 얻을 것 같아요. 물론 최종 메서드 ("LIMIT %d ", page*RECORDS_PER_PAGE)에 값을 공급할 수 있지만 그다지 효율적이지 않습니다. 전 처리기가 특별한 방법으로 문자열을 처리하지 않고 일반 코드처럼 내용을 처리하기를 바랄 때가 왔습니다. 지금은 #define RECORDS_PER_PAGE_TXT "10"으로 축약되었지만 분명히 그것에 대해 만족스럽지 않습니다.

권리를 얻는 방법?

+2

나를 위해 gcc에서 올바르게 사전 처리되었습니다. – kennytm

+0

Linux 커널 예제 : http://lxr.free-electrons.com/source/include/linux/stringify.h?v=4.7 –

답변

37

아래 정의 된 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) ";" 
+1

이것이 최근 요구 사항입니까? 지난 번에 내가 문자열을 사용하는 등의 요령이 필요했던 것을 기억하지 못합니다 ... – PypeBros

+0

자세한 내용은 http://gcc.gnu.org/onlinedocs에서 사용할 수있는 stringification (GNU CPP)의 메커니즘 및 차이점에 대한 추가 설명을 참조하십시오. /cpp/Stringification.html. –

+1

업데이트 된 GCC 문서 링크 : https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html#Stringizing – eresonance

2

더블

#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_PAGEESCAPEQUOTE 매크로 호출로 확장되며, DOUBLEESCAPE으로 보내어 따옴표를 붙입니다.

+0

#의 내용이 먼저 평가되지 않기 때문에 올바른 값으로 대체하지 않습니다 . –

+0

@Mike 이중 탈출을 잊어 버렸습니다 –

1
#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; 

참고 간접 그들을 stringifying 전에 인수를 평가하는 _REQUEST_RECORDS합니다.