托管 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")的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的二进制字面量

使用托管 C++ 项目中的 C# 类

C# 中的非托管 C++ 类

C++基础知识之常量(字面量) 变量

C# 托管

如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容