【问题标题】:Visual Studio 2008: String Literals "??-", "??'", "??=" corruptVisual Studio 2008:字符串文字“??-”、“??'”、“??=”已损坏
【发布时间】:2016-05-31 21:38:27
【问题描述】:

最近我在 Visual Studio 2008 中遇到了一个错误(至少我认为是一个)。

当我尝试使用两个问号后跟另一个字符创建 string-literals 时,会发生一些奇怪的事情:这三个字符被另一个字符替换。

例子:

printf("??-"); --> ~  (hyphen)
printf("??'"); --> ^  (circumflex)
printf("??="); --> #  (hash)
printf("??)"); --> ]  (square braket)
printf("??("); --> [  (square braket)
printf("??/"); --> \  (backslash)
printf("??!"); --> |  (pipe)
printf("??%"); --> ?? (percent sign disappears)

有人知道更换的原因吗?

【问题讨论】:

  • 不确定原因,但printf(@"??-"); 必须有效。而且我知道您正在寻找原因而不是解决方案。但只是指出它可以帮助某人
  • 我认为您可以通过使用\? 而不是普通的? 来避免这些替换。
  • 最后一个是“正常”行为 - 到printf% 你需要%% 格式字符串。
  • @Reddy:不,printf(@"??-") 不适用于 VS2008 和 C++
  • 这是个好问题。 +1

标签: c++ visual-studio-2008 string-literals character-replacement


【解决方案1】:

这不是错误,更多的是历史遗留问题。它们是 C 三元组 - https://msdn.microsoft.com/en-us/library/bt0y4awe.aspx

Di/Tri-graphs 是一种表示在语言开发时不易使用的字符的方法。它们允许您在源代码中输入您可能没有键盘键来表示的符号。

Tri-graph Symbol
??=       #
??/       \
??'       ^
??(       [
??)       ]
??!       |
??<       {
??>       }
??-       ~

% 问题只是 printf 中的常见问题,如果您希望看到它,您需要用 % 转义 %。这是因为 % 通常是格式说明符的开头。

【讨论】:

  • 从未听说过“三图”。谢谢!
  • 一个有用的解决方法是在两个问号之后拆分三图:printf("??" "-")。这绝对有效:)
  • 您通常可以在大多数编译器中关闭它们。这意味着您的代码并不严格符合标准,但如今很少有人真正想要 di/trigraph。
  • 它们已经从下一个标准 (C++17) 的草案中删除,因此现代编译器放弃该功能是有意义的。 VS2008 当然不支持 C++17 ;)
猜你喜欢
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多