2010-04-16 28 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... */ 

इस बारे में "आवारा #" एक संदेश के साथ विफल रहता है, और यहां तक ​​कि अगर यह काम किया, मुझे लगता है मैं मिल चाहते हैं मैक्रो नाम, stringified नहीं मान। बेशक मैं मूल्यों को अंतिम विधि ("LIMIT %d ", page*RECORDS_PER_PAGE) पर खिला सकता हूं लेकिन यह न तो सुंदर और न ही कुशल है। यह ऐसा समय है जब मैं चाहता हूं कि प्रीप्रोसेसर तारों को विशेष तरीके से नहीं मानता और सामान्य सामग्री की तरह उनकी सामग्री को संसाधित करेगा। अभी के लिए, मैंने इसे #define RECORDS_PER_PAGE_TXT "10" से चिपकाया लेकिन समझ में आता है, मैं इसके बारे में खुश नहीं हूं।

इसे कैसे प्राप्त करें?

+2

जीसीसी पर मेरे लिए सही ढंग से प्रीप्रोसेस्ड। – kennytm

+0

लिनक्स कर्नेल पर उदाहरण: http://lxr.free-electrons.com/source/include/linux/stringify.h?v=4.7 –

उत्तर

37

xstr मैक्रो नीचे परिभाषित वृहद विस्तार करने के बाद stringify होगा।

#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 पर उपलब्ध स्ट्रिंगफिकेशन (जीएनयू सीपीपी) के मैकेनिक्स (और न्युअंस) का अतिरिक्त विवरण /cpp/Stringification.html। –

+1

अद्यतन जीसीसी दस्तावेज़ लिंक: 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_PAGE को ESCAPEQUOTE मैक्रो कॉल द्वारा विस्तारित किया जाएगा, जिसे उद्धृत करने के लिए DOUBLEESCAPE में भेजा जाता है।

+0

लेकिन यह सही मानों को प्रतिस्थापित नहीं करता है क्योंकि # की सामग्री का मूल्यांकन नहीं किया जाता है । –

+0

@ माइक डबल एस्केप भूल गए –

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 करने के लिए।