মাল্টি-লাইন প্লেইন-পাঠ্য, সি ++, à লা পার্লে ধ্রুব আক্ষরিক কোনও উপায় আছে কি? #include
কোনও ফাইল যুক্ত করার সাথে কিছু পার্সিং ট্রিক ? আমি একজনের কথা ভাবতে পারি না, তবে ছেলে, এটা ভাল লাগবে। আমি জানি এটি সি ++ 0x এ হবে।
মাল্টি-লাইন প্লেইন-পাঠ্য, সি ++, à লা পার্লে ধ্রুব আক্ষরিক কোনও উপায় আছে কি? #include
কোনও ফাইল যুক্ত করার সাথে কিছু পার্সিং ট্রিক ? আমি একজনের কথা ভাবতে পারি না, তবে ছেলে, এটা ভাল লাগবে। আমি জানি এটি সি ++ 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.";
ইন্ডেন্টেশনটি কোনও বিষয় নয়, যেহেতু এটি কোটের ভিতরে নেই।
আপনি এম্বেড করা নতুন লাইনটি এড়াতে যতক্ষণ যত্ন নেন ততক্ষণ আপনি এটিও করতে পারেন। এটি করতে ব্যর্থতা, আমার প্রথম উত্তরটির মতো, সংকলন করবে না:
কনস্ট চর * পাঠ্য 2 = "এখানে, অন্যদিকে, আমি পাগল হয়ে গেছি \ এবং সত্যিই আক্ষরিক কয়েকটি লাইন বিস্তৃত যাক, \ প্রতিটি লাইনের quot উদ্ধৃতি দিয়ে বিরক্ত না করে বিষয়বস্তু। এটি কাজ করে, তবে আপনি ইনডেন্ট করতে পারবেন না ";
আবার, প্রতিটি লাইনের শেষে সেই ব্যাকস্ল্যাশগুলি লক্ষ করুন, তারা অবশ্যই লাইন শেষ হওয়ার আগেই হওয়া উচিত, তারা উত্সটিতে নতুন লাইনটি থেকে পালাচ্ছে, যাতে সমস্ত কিছুই এমনভাবে কাজ করে যাতে নিউলাইন ছিল না। আপনার যেখানে ব্যাকস্ল্যাশ ছিল সেখানে স্ট্রিংয়ে আপনি নিউলাইনগুলি পাবেন না। এই ফর্মের সাহায্যে আপনি স্পষ্টতই পাঠ্যটি ইন্ডেন্ট করতে পারবেন না যেহেতু ইনডেন্টেশনটি স্ট্রিংয়ের অংশ হয়ে যাবে এবং এলোমেলো স্পেস দিয়ে এটিকে আবদ্ধ করে তুলবে।
সি ++ 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";
স্ট্রিংয়ের সমস্ত স্পেস এবং ইন্ডেন্টেশন এবং নতুন লাইনগুলি সংরক্ষিত আছে।
এগুলি utf-8 | 16 | 32 বা wchar_t (সাধারণ উপসর্গ সহ )ও হতে পারে।
আমার উল্লেখ করা উচিত যে পালানোর ক্রম, ভি0জি0 এন, এখানে আসলে প্রয়োজন নেই। এর উপস্থিতিটি "স্ট্রিংয়ের ভিতরে রাখার অনুমতি দেয় other অন্য কথায়, আমি রাখতে পারি
"(by Prostetnic Vogon Jeltz; see p. 56/57)"
(অতিরিক্ত উদ্ধৃতি নোট করুন) এবং উপরের স্ট্রিংটি এখনও সঠিক হবে। অন্যথায় আমি ঠিক পাশাপাশি ব্যবহার করতে পারে
const char * vogon_poem = R"( ... )";
উদ্ধৃতিগুলির ভিতরে থাকা পেরেনগুলি এখনও প্রয়োজন।
#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);
জিসিসি 4.6 বা জি ++ 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__
কমা বিভাজকটি প্রক্রিয়া করে না। সুতরাং আপনি এটি স্ট্রিংাইজিং অপারেটরে পাস করতে পারেন। শীর্ষস্থানীয় এবং পিছনের স্থানগুলি ছাঁটাই করা হয়, এবং শব্দের মধ্যে স্পেসগুলি (নতুন লাইনগুলি সহ) তখন একটি একক জায়গায় সংকুচিত করা হয়। প্যারেন্টিগুলি ভারসাম্যপূর্ণ হওয়া দরকার। আমি মনে করি এই ত্রুটিগুলি ব্যাখ্যা করে যে কেন সি ++ 11 এর ডিজাইনাররা #__VA_ARGS__
কাঁচা স্ট্রিংয়ের আক্ষরিক প্রয়োজন দেখেছিল।
@ আনওয়াইন্ডের উত্তরে @ এমএমএসের মন্তব্যে কিছুটা ব্যাখ্যা করার জন্য, যদি কারও কাছে সি ++ 11 সংকলক (জিসিসি 4.2.1 বলুন) ভাগ্যবান না হয় এবং কেউ স্ট্রিংয়ে নতুন লাইনগুলি এম্বেড করতে চায় (হয় চর *) বা ক্লাস স্ট্রিং), কেউ এর মতো কিছু লিখতে পারেন:
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। যদি আপনার প্রকল্পে বুস্ট না পাওয়া যায় তবে আপনি আধুনিক সি ++ তে স্টাড :: স্ট্রিং_ভিউ () ব্যবহার করতে পারেন।