क्या बहु-स्तरीय सादा-पाठ, C ++ में निरंतर शाब्दिक, ला ला पर्ल का कोई तरीका है? शायद #include
एक फ़ाइल के साथ कुछ पार्सिंग चाल ? मैं एक के बारे में सोच नहीं सकता, लेकिन लड़का, यह अच्छा होगा। मुझे पता है कि यह C ++ 0x में होगा।
क्या बहु-स्तरीय सादा-पाठ, C ++ में निरंतर शाब्दिक, ला ला पर्ल का कोई तरीका है? शायद #include
एक फ़ाइल के साथ कुछ पार्सिंग चाल ? मैं एक के बारे में सोच नहीं सकता, लेकिन लड़का, यह अच्छा होगा। मुझे पता है कि यह C ++ 0x में होगा।
जवाबों:
अच्छी तरह की। सबसे आसान सिर्फ इस तथ्य का उपयोग करना है कि आसन्न स्ट्रिंग शाब्दिक संकलक द्वारा समेटे हुए हैं:
const char *text =
"This text is pretty long, but will be "
"concatenated into just a single string. "
"The disadvantage is that you have to quote "
"each part, and newlines must be literal as "
"usual.";
इंडेंटेशन मायने नहीं रखता, क्योंकि यह उद्धरण के अंदर नहीं है।
आप यह भी कर सकते हैं, जब तक आप एम्बेडेड न्यूलाइन से बचने के लिए ध्यान रखते हैं। ऐसा करने में विफलता, जैसे मेरा पहला उत्तर था, संकलन नहीं होगा:
const char * text2 = "यहाँ, दूसरी ओर, मैं पागल हो गया हूँ" और वास्तव में शाब्दिक कई पंक्तियों को फैलाया, \ प्रत्येक पंक्ति के उद्धरण से परेशान हुए बिना सामग्री। यह काम करता है, लेकिन आप इंडेंट नहीं कर सकते हैं। "
फिर से, प्रत्येक पंक्ति के अंत में उन बैकस्लैश पर ध्यान दें, लाइन समाप्त होने से पहले उन्हें तुरंत होना चाहिए, वे स्रोत में नई रेखा से बच रहे हैं, ताकि सब कुछ ऐसा हो जाए जैसे कि नई रेखा नहीं थी। आपको उन स्थानों पर स्ट्रिंग में नए समाचार नहीं मिलते हैं, जहां आपके पास बैकस्लैश थे। इस फॉर्म के साथ, आप स्पष्ट रूप से पाठ को इंडेंट नहीं कर सकते क्योंकि इंडेंटेशन फिर स्ट्रिंग का हिस्सा बन जाएगा, इसे यादृच्छिक रिक्त स्थान के साथ जोड़कर।
C ++ 11 में आपके पास कच्चे स्ट्रिंग शाब्दिक हैं। यहाँ छाँटे-छाँटे जैसे पाठ और पायथन और पर्ल और रूबी जैसी लिपि भाषाओं में।
const char * vogon_poem = R"V0G0N(
O freddled gruntbuggly thy micturations are to me
As plured gabbleblochits on a lurgid bee.
Groop, I implore thee my foonting turlingdromes.
And hooptiously drangle me with crinkly bindlewurdles,
Or I will rend thee in the gobberwarts with my blurlecruncheon, see if I don't.
(by Prostetnic Vogon Jeltz; see p. 56/57)
)V0G0N";
सभी रिक्त स्थान और इंडेंटेशन और स्ट्रिंग में newlines संरक्षित हैं।
ये भी utf-8 | 16 | 32 या wchar_t (सामान्य उपसर्गों के साथ) हो सकते हैं।
मुझे कहना चाहिए कि भागने का क्रम, V0G0N, वास्तव में यहाँ की आवश्यकता नहीं है। इसकी उपस्थिति स्ट्रिंग के अंदर डालने की अनुमति देती है) "दूसरे शब्दों में, मैं डाल सकता था
"(by Prostetnic Vogon Jeltz; see p. 56/57)"
(नोट अतिरिक्त उद्धरण) और उपरोक्त स्ट्रिंग अभी भी सही होगी। वरना मैं भी बस इस्तेमाल कर सकता था
const char * vogon_poem = R"( ... )";
उद्धरण के अंदर अभी भी parens की जरूरत है।
#if 0
... #endif
घोंसले भी।
#define MULTILINE(...) #__VA_ARGS__
कोष्ठक के बीच सब कुछ का उपभोग करता है।
किसी एकल स्थान द्वारा किसी भी संख्या में लगातार व्हाट्सएप वर्णों को प्रतिस्थापित करता है।
\n
अगर आपको नई सुर्खियों की जरूरत है
` (and hence
\ n ) is copied literally, but
"` को रूपांतरित किया जाता है \"
। इसलिए MULTILINE(1, "2" \3)
पैदावार "1, \"2\" \3"
।
मल्टी-लाइन स्ट्रिंग्स में प्रवेश करने का एक सुविधाजनक तरीका मैक्रो का उपयोग करके है। यह केवल तभी काम करता है जब उद्धरण और कोष्ठक संतुलित हों और इसमें 'शीर्ष स्तर' अल्पविराम शामिल न हो:
#define MULTI_LINE_STRING(a) #a
const char *text = MULTI_LINE_STRING(
Using this trick(,) you don't need to use quotes.
Though newlines and multiple white spaces
will be replaced by a single whitespace.
);
printf("[[%s]]\n",text);
Gcc 4.6 या g ++ 4.6 के साथ संकलित, यह उत्पादन करता है: [[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]
ध्यान दें कि ,
यह स्ट्रिंग में नहीं हो सकता है, जब तक कि इसे कोष्ठक या उद्धरण के भीतर समाहित नहीं किया गया है। एकल उद्धरण संभव है, लेकिन संकलक चेतावनी बनाता है।
संपादित करें: जैसा कि टिप्पणियों में बताया गया है, #define MULTI_LINE_STRING(...) #__VA_ARGS__
के उपयोग की अनुमति देता है ,
।
#define MULTILINE(...) #__VA_ARGS__
यदि आप चाहते हैं कि आप अपने स्ट्रिंग को कॉमा में शामिल कर सकते हैं ।
\n
और \r
), जो कुछ मामलों के लिए काम की तरह और दूसरों के लिए घातक है।
आप यह भी कर सकते हैं:
const char *longString = R""""(
This is
a very
long
string
)"""";
char longString[] = R""""( This is a very long string )"""";
भी काम करता है, जाहिर है, मेरे लिए भी काम करता है।
चूंकि अनुभव का एक औंस सिद्धांत के एक टन के लायक है, मैंने इसके लिए थोड़ा परीक्षण कार्यक्रम की कोशिश की MULTILINE
:
#define MULTILINE(...) #__VA_ARGS__
const char *mstr[] =
{
MULTILINE(1, 2, 3), // "1, 2, 3"
MULTILINE(1,2,3), // "1,2,3"
MULTILINE(1 , 2 , 3), // "1 , 2 , 3"
MULTILINE( 1 , 2 , 3 ), // "1 , 2 , 3"
MULTILINE((1, 2, 3)), // "(1, 2, 3)"
MULTILINE(1
2
3), // "1 2 3"
MULTILINE(1\n2\n3\n), // "1\n2\n3\n"
MULTILINE(1\n
2\n
3\n), // "1\n 2\n 3\n"
MULTILINE(1, "2" \3) // "1, \"2\" \3"
};
इस टुकड़े cpp -P -std=c++11 filename
को पुन: पेश करने के लिए संकलित करें ।
इसके पीछे की चाल #__VA_ARGS__
यह है कि __VA_ARGS__
अल्पविराम विभाजक को संसाधित नहीं करता है। तो आप इसे स्ट्रिंगिंग ऑपरेटर को पास कर सकते हैं। अग्रणी और अनुगामी रिक्त स्थान छंटनी की जाती हैं, और शब्दों के बीच रिक्त स्थान (नई-नई सहित) तब एक ही स्थान पर संकुचित होते हैं। कोष्ठक को संतुलित करने की आवश्यकता है। मुझे लगता है कि इन कमियों की वजह से C ++ 11 के डिजाइनरों #__VA_ARGS__
ने कच्चे स्ट्रिंग शाब्दिकों की आवश्यकता को देखा।
सिर्फ @ खोल के जवाब में @ emsr की टिप्पणी पर थोड़ा सा विचार करें, यदि कोई भाग्यशाली नहीं है कि उसके पास C ++ 11 कंपाइलर (GCC 4.2.1 कहें), और कोई स्ट्रिंग में नईलाइन्स एम्बेड करना चाहता है (या तो char * या कक्षा स्ट्रिंग), कोई इस तरह से कुछ लिख सकता है:
const char *text =
"This text is pretty long, but will be\n"
"concatenated into just a single string.\n"
"The disadvantage is that you have to quote\n"
"each part, and newlines must be literal as\n"
"usual.";
बहुत स्पष्ट, सत्य, लेकिन @ एम्सआर की संक्षिप्त टिप्पणी मेरे द्वारा पहली बार पढ़ने पर मेरे बारे में नहीं छपी थी, इसलिए मुझे इसके लिए स्वयं को खोजना पड़ा। उम्मीद है, मैंने कुछ मिनटों के बाद किसी और को बचाया है।
// C++11.
std::string index_html=R"html(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>VIPSDK MONITOR</title>
<meta http-equiv="refresh" content="10">
</head>
<style type="text/css">
</style>
</html>
)html";
विकल्प 1. बूस्ट लाइब्रेरी का उपयोग करके, आप स्ट्रिंग को नीचे घोषित कर सकते हैं
const boost::string_view helpText = "This is very long help text.\n"
"Also more text is here\n"
"And here\n"
// Pass help text here
setHelpText(helpText);
विकल्प 2. यदि आपके प्रोजेक्ट में बूस्ट उपलब्ध नहीं है, तो आप आधुनिक C ++ में std :: string_view () का उपयोग कर सकते हैं।