托管 C++ 中的逐字字面量? (就像 C# 的 @"blah")
Posted
技术标签:
【中文标题】托管 C++ 中的逐字字面量? (就像 C# 的 @"blah")【英文标题】:Verbatim Literals in Managed C++? (like C#'s @"blah") 【发布时间】:2008-12-09 16:52:33 【问题描述】:有没有办法在托管 C++ 中使用逐字字符串文字?类似于 C# 的
String Docs = @"c:\documents and settings\"
【问题讨论】:
【参考方案1】:在 C++11 中,有原始字符串字面量:
cout<<R"((\"ddd\aa)\n)"<<endl;
cout<<R"delimiter((\"ddd\aa)\n)delimiter"<<endl;
输出是:
(\"ddd\aa)\n
(\"ddd\aa)\n
【讨论】:
【参考方案2】:目前这是不可能的。托管 C++ 字符串文字具有与普通 C++ 字符串几乎完全相同的规则。托管 C++ 规范实际上只是 ANSI C++ 标准的扩充。
目前在 C++ 中不支持 C# 样式文字语法(托管或非托管)。您必须手动转义每个字符。
有关详细信息,请参阅 C++/CLI 规范中的第 9.1.3.3 节。 (Spec Link)
【讨论】:
这个答案在给出时比现在正确得多。 @RichardPlunkett 鉴于当前事物状态的反映,我们应该编辑或删除这篇文章吗? 可以使用原始字符串文字来达到预期的效果: String^ f = gcnew String(R"(C:\foo\bar.txt)"); [谷歌 msdn C++ 字符串文字了解更多信息]【参考方案3】:虽然不如 '@' C# 逐字字符串文字那么简洁,但以下内容确实编译了 /Clr:pure,因此您可以将 C++ 原始字符串文字用于纯 MSIL 和类似的结果:
String^ f = gcnew String(R"(C:\foo\bar.txt)");
原始字符串文字也可以在常规 C++ 中使用:
char *x = R"(C:\foo\bar.txt)";
谷歌“msdn C++ 字符串文字”了解更多信息
【讨论】:
哦!伟大的!!非常感谢【参考方案4】:snip .. 对于 .NET 编程,Visual Studio 2017 中的 Visual C++ 支持使用 /clr(公共语言运行时编译)编译器选项创建混合程序集。 /clr:pure 和 clr:safe 选项在 Visual Studio 2015 中已弃用,在 Visual Studio 2017 中不受支持。如果您的代码需要安全或可验证,我们建议您将其移植到 C#。
【讨论】:
以上是关于托管 C++ 中的逐字字面量? (就像 C# 的 @"blah")的主要内容,如果未能解决你的问题,请参考以下文章