【问题标题】:Why MSVC compiler converts "??-" sequence to "~" in string literals?为什么 MSVC 编译器将字符串文字中的“??-”序列转换为“~”?
【发布时间】:2014-04-15 11:55:51
【问题描述】:

我的代码中有一个硬编码字符串(应该用作文件掩码),但编译器总是将“??-”序列更改为“~”,例如:

const wchar_t textW[] = L"test-??-??-??.txt";

testW 将是“test-~~??.txt”(不带引号)。

同样的情况也发生在非 unicode 字符串上:

const char textA[] = "test-????-??-??.txt";

textA 将是“test-??~~??.txt”(不带引号)。

我的编译器是 Microsoft Visual C++ 2008。

我刚刚在 Visual Studio 2013 上尝试过,运行时的字符串是正确的,并且当我跟踪应用程序时,智能感知在工具提示上显示正确的值,但是......但是在写作模式下(当应用程序不是t running) intellisense 在工具提示上使用 tildas 显示不正确的值。

【问题讨论】:

  • 谢谢,完全忘记了三元组。
  • 大多数人都这样做,这很不常见,但仍受支持。

标签: c++ string visual-c++ trigraphs


【解决方案1】:

这是trigraph,一种表达键盘上并不总是可用的字符的方式。

此行为由/Zc:trigraphs 选项控制,默认情况下该选项是关闭的。它似乎已为您的项目启用,我建议您禁用它。

【讨论】:

    【解决方案2】:

    它被称为trigraph。它们被预处理器替换。

    【讨论】:

    • 是的,它是一个三元组。但是三元组实际上在翻译阶段 1 中被替换,远在预处理器(翻译阶段 4)看到文件之前。
    • 我猜这是“预处理器”的非正式用法,表示创建形成翻译单元的标记序列的整个过程。
    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多