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

Nik*_*iou 25 c++ visual-c++

替代令牌是有效的 c ++ 关键字,但在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;
}
Run Code Online (Sandbox Code Playgroud)

既然and or not有很长一段时间了,有没有理由不实施它们

Ben*_*igt 24

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

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

  • 没关系,发现它:http://msdn.microsoft.com/en-us/library/34h23df8.aspx (2认同)

AnT*_*AnT 14

形式上,这些关键字实现的,并且由编译器内在支持,不包括任何头.但是,为此,您必须在该C++编译器的"更标准"模式下编译源代码,这意味着使用该/Za选项.

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

  • @Ben Voigt:是的,但"扩展"的正式定义清楚地表明扩展不允许破坏任何兼容代码.换句话说,允许真正的扩展"定义标准未定义的内容",但不允许它们"取消定义(或重新定义)标准已定义的内容".形式上,扩展允许*扩展*可编译代码的域,但不允许*收缩*它. (4认同)
  • “扩展”是让程序员将这些名称作为标识符。 (2认同)

Bri*_*ian 12

VS是不合格的.这是个老消息.

要使用替代令牌,请包含<ciso646>标题.根据标准,包括这个头在C++中应该没有效果.但是,你确实需要在VS. 因此,只要有可能您正在使用VS进行编译,就可以随时包含它.

  • 正如已经指出的那样,这种"不一致"仅适用于默认编译设置.大多数(如果不是全部)编译器在默认模式下都不符合要求.指定`/ Za`选项会从VS编译器中删除此不符合项. (8认同)

Kon*_*lph 6

因为

#include<iso646.h>(或ciso646)是我们如何支持这些关键字

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