为什么VS没有为逻辑运算符定义替代令牌?

时间:2014-06-25 16:33:46

标签: c++ visual-c++

替代令牌是valid c ++ keywords,但在Visual Studio 2013中,以下内容会发出编译错误(未声明的标识符):

int main(int argc, const char* argv[])
{
    int k(1), l(2);
    if (k and l) cout << "both non zero\n";

    return 0;
}

由于and or not已存在很长时间,是否有理由不实施

5 个答案:

答案 0 :(得分:24)

你问的理由是什么。这是一个可能的原因,不一定是影响Visual C ++团队的最重要原因:

  1. 这些是C中的有效标识符。
  2. Microsoft的建议一直是将C ++模式用于C和C ++代码,而不是维护现代C编译器。
  3. 使用这些作为标识符的有效C代码如果被编译为关键字,将无理中断。
  4. 尝试编写可移植C ++的人大多使用/permissive-/Za来获得最大一致性,这将导致这些被视为关键字。
  5. 通过包含头文件将/Ze中的关键字视为关键字的解决方法既简单又便携。 (G ++的解决方法-fno-operator-names也不错,但是将选项放在源代码而不是构建系统中会更好一些。)

答案 1 :(得分:13)

正式地,这些关键字实现的,并且由编译器内在支持,而不包括任何标头。但是,为此,你必须在&#34;更标准的&#34;中编译你的源代码。该C ++编译器的模式,这意味着使用/Za选项。

根据意图,/Za选项应该&#34;禁用编译器扩展&#34;。当然,不支持在兼容的编译器中应该存在的东西不能被正式限定为&#34;编译器扩展&#34;。然而,这就是目前的情况。

答案 2 :(得分:11)

VS不合格。这是个老消息。

要使用替代令牌,请添加<ciso646>标头。根据标准,包括这个头在C ++中应该没有效果。但是,你确实需要在VS.因此,只要有可能与VS一起编译,就可以安全地包含它。

答案 3 :(得分:5)

Because

  #include(或<iso646.h>)的{p> ciso646是我们支持这些关键字的方式

因为“没人”(在我之前)曾要求过这个。没关系,这是在2007年,人们一直在网上要求这个。

答案 4 :(得分:1)

(当前更新)

我做了一个小测试:一个新的“ Windows桌面应用程序”项目。 IDE(Visual Studio 2017 15.7.5)默认情况下设置以下C ++语言一致性设置: / permissive- / Zc:wchar_t / Zc:forScope / Zc:inline >。另外,我将 C ++语言标准 设置为 ISO C ++ /最新草案 (当前为C ++ 17)。另外,我在main()中添加了以下两行:

bool a, b, c;

a = b and c;

它成功地编译了逻辑运算符的文本形式。但是,当我将IDE的 一致性模式 更改为 (=>且没有 / permissive - )并重新编译,编译器将标记:“错误C2065:'and':未声明的标识符”。

默认情况下,在由Visual Studio 2017 15.5版(2017年12月)和更高版本创建的新项目中设置 / permissive- 编译器选项。在早期版本中,默认情况下未设置。因此,如果有人在15.5版之前创建了一个项目,并且在将IDE更新到最新版本之前,仍然需要在项目中手动设置此编译器选项。

/ Ze 编译器选项(默认情况下处于启用状态)启用Microsoft扩展。 / Ze 选项已被弃用,因为默认情况下其行为是打开的。 MSDN建议使用 / Zc (一致性)编译器选项来控制特定的语言扩展功能。