2015-05-18 3 views
31

दो अक्षर )" कच्चे स्ट्रिंग नीचे दिए गए उदाहरण में शाब्दिक समाप्त शाब्दिक।
अनुक्रम )" कुछ बिंदु पर अपने पाठ में दिखाई दे सकता है, और मैं स्ट्रिंग भी जारी रखना चाहते हैं । यदि इस क्रम में यह भीतर पाया जाता हैकच्चे स्ट्रिंग में शामिल करें) "बिना कहा समाप्त शाब्दिक

R"( 
    Some Text)" 
)";  // ^^ 

मैं इसे कैसे समाप्त बिना अनुक्रम )" स्ट्रिंग के भीतर शाब्दिक शामिल कर सकते हैं

उत्तर

56

Raw string literals आपके द्वारा निर्दिष्ट करते हैं एक लगभग मनमाना * सीमांकक:

//choose ### as the delimiter so only)###" ends the string 
R"###( 
    Some Text)" 
)###"; 

* सटीक नियम हैं: "बुनियादी स्रोत चरित्र के किसी भी सदस्य को छोड़कर सेट: अंतरिक्ष, बाएं कोष्ठक (, दायां कोष्ठक), बैकस्लैश \, और नियंत्रण वर्ण क्षैतिज टैब, ऊर्ध्वाधर टैब, प्रपत्र फ़ीड, और न्यू लाइन "(N3936 §2.14.5 [lex.string] व्याकरण) और" सबसे 16 पात्रों को अभिव्यक्त करने वाले "(§2.14.5/2)

23

बचने जीता ' के बाद से यह एक कच्चे शाब्दिक है, लेकिन वाक्य रचना आरंभ और अंत के स्पष्ट सीमांकन अनुमति देने के लिए डिज़ाइन किया गया है टी तुम्हारी मदद, aha की तरह एक छोटे से मनमाना वाक्यांश शुरू करने से।

R"aha( 
    Some Text)" 
)aha"; 

वैसे अंत में ) और " के आदेश ध्यान रखें कि आपके उदाहरण के विपरीत।


(मानक का अध्ययन) औपचारिक, पहली नजर में के बारे में

यह के रूप में यदि भागने साधारण शाब्दिक में के रूप में कच्चे स्ट्रिंग शाब्दिक में एक ही काम करता है लग सकता है। एक को छोड़कर यह नहीं जानता कि यह नहीं है, तो यह कैसे संभव है, जब नियमों में कोई अपवाद नहीं देखा जाता है? खैर, जब कच्चे स्ट्रिंग शाब्दिक सी ++ 11 में पेश किए गए यह एक अतिरिक्त नाश अनुवाद चरण को शुरू करने जैसे के प्रभाव नाश के माध्यम से था भागने !, बुद्धि, और नरक करने के लिए;

सी ++ 11 §2.5/3

” बीच कच्चे स्ट्रिंग के प्रारंभिक और अंतिम दोहरे उद्धरण वर्ण, चरणों में प्रदर्शन किसी भी परिवर्तनों 1 और 2 (trigraphs, सार्वभौमिक-चरित्र -नाम, और रेखा splicing) वापस कर रहे हैं; इस वापसी से किसी भी डी-चार से पहले लागू नहीं होगी, आर-चार, या परिसीमन कोष्टक पहचान की है।

यह सी ++ में कर रहे हैं यूनिकोड वर्ण विनिर्देशों (सार्वभौमिक-चरित्र-नाम\u0042 की तरह) है, जो हालांकि वे देखते हैं और पलायन की तरह काम का ख्याल रखता है औपचारिक रूप से, दृश्यों से बच नहीं।

सच औपचारिक पलायन नियंत्रित किया जाता है, या बल्कि, एक कच्चे स्ट्रिंग शाब्दिक की सामग्री के लिए एक कस्टम व्याकरण नियम का उपयोग करके !, नहीं संभाला। अर्थात् सी ++ §2.14 में।5 कच्चे-स्ट्रिंग व्याकरण इकाई के रूप में परिभाषित किया गया है

"डी-वर्ण-अनुक्रम ऑप्ट(आर-चार-अनुक्रम ऑप्ट)डी-वर्ण-अनुक्रम ऑप्ट"

, जहां एक आर-चार-अनुक्रम एक दायां कोष्ठक ) पीछा छोड़कर आर-चार,

स्रोत वर्ण सेट के किसी भी सदस्य है, जिनमें से प्रत्येक के एक दृश्य के रूप में परिभाषित किया गया है प्रारंभिक डी-चार-अनुक्रम द्वारा है (जो खाली हो सकता है) एक दोहरे उद्धरण के बाद [ऊपर aha की तरह] "


अनिवार्य रूप से उपर्युक्त मतलब है कि न केवल आप कच्चे तारों में सीधे भागने का उपयोग नहीं कर सकते हैं (जो कि बिंदु है, यह सकारात्मक है, नकारात्मक नहीं है), आप सीधे यूनिकोड चरित्र विनिर्देशों का उपयोग नहीं कर सकते हैं।

यहाँ कैसे परोक्ष रूप से यह करना है:

#include <iostream> 
using namespace std; 

auto main() -> int 
{ 
    cout << "Ordinary string with a '\u0042' character.\n"; 
    cout << R"(Raw string without a '\u0042' character, and no \n either.)" "\n"; 
    cout << R"(Raw string without a '\u0042' character, i.e. no ')" "\u0042" R"(' character.)" "\n"; 
} 

आउटपुट:

 
Ordinary string with a 'B' character. 
Raw string without a '\u0042' character, and no \n either. 
Raw string without a '\u0042' character, i.e. no 'B' character. 
2

आप उपयोग कर सकते हैं,

R"aaa( 
    Some Text)" 
)aaa"; 

यहाँ aaa अपने स्ट्रिंग सीमांकक हो जाएगा।

संबंधित मुद्दे