有没有办法有多行纯文本,常量字面量在c++, à la Perl?也许是使用#include文件的一些解析技巧?我想不出一个,但那太好了。我知道是c++ 0x。
当前回答
由于一盎司的经验胜过一吨的理论,我尝试了一个关于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的文件名来编译这个片段。
#__VA_ARGS__背后的技巧是__VA_ARGS__不处理逗号分隔符。你可以把它传递给字符串化操作符。开头和结尾的空格被修剪,单词之间的空格(包括换行)被压缩为一个空格。括号需要平衡。我认为这些缺点解释了为什么c++ 11的设计者,尽管有#__VA_ARGS__,看到了原始字符串字面量的需求。
其他回答
// 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";
为了在@unwind的回答中稍微说明一下@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.";
很明显,这是真的,但是@emsr的简短评论在我第一次读到这篇文章时并没有跳入我的脑海,所以我必须自己去发现。希望我为其他人节省了几分钟时间。
选项1。使用boost库,可以如下所示声明字符串
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);
第二个选项。如果boost在你的项目中不可用,你可以在现代c++中使用std::string_view()。
输入多行字符串可能很方便的方法是使用宏。这只适用于引号和括号平衡,并且不包含“顶级”逗号的情况:
#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编译,会生成:[[使用这个技巧(,)你不需要使用引号。虽然换行符和多个空格将被单个空格取代。
注意,不能在字符串中,除非它包含在括号或引号中。可以使用单引号,但会产生编译器警告。
编辑:正如评论中提到的,#define MULTI_LINE_STRING(…)#__VA_ARGS__允许使用,。
由于一盎司的经验胜过一吨的理论,我尝试了一个关于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的文件名来编译这个片段。
#__VA_ARGS__背后的技巧是__VA_ARGS__不处理逗号分隔符。你可以把它传递给字符串化操作符。开头和结尾的空格被修剪,单词之间的空格(包括换行)被压缩为一个空格。括号需要平衡。我认为这些缺点解释了为什么c++ 11的设计者,尽管有#__VA_ARGS__,看到了原始字符串字面量的需求。
推荐文章
- 为什么这个结合赋值和相等检查的if语句返回true?
- cplusplus.com给出的错误、误解或坏建议是什么?
- 找出质数最快的算法是什么?
- c++枚举类可以有方法吗?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 在函数的签名中添加关键字
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 为什么在标准容器中使用std::auto_ptr<>是错误的?
- 用比较double和0
- 保护可执行文件不受逆向工程的影响?
- 在c++中字符串前面的“L”是什么意思?
- 为什么std::map被实现为红黑树?