为什么VS不为逻辑运算符定义替代标记? 可选令牌是C++,但在VisualStudio 2013中,下面发出编译错误(未声明的标识符): int main(int argc,const char*argv[] { int k(1),l(2); 如果(k和l)不能

为什么VS不为逻辑运算符定义替代标记? 可选令牌是C++,但在VisualStudio 2013中,下面发出编译错误(未声明的标识符): int main(int argc,const char*argv[] { int k(1),l(2); 如果(k和l)不能,c++,visual-c++,C++,Visual C++,VS是不合格的,这是老消息 使用替代令牌,包括 标题。根据标准,包括这个头在C++中不起作用。然而,您确实需要它。因此,无论何时您有可能编译vs. 现代Visual Studio(或更确切地说,MSVC),它总是安全的。确实支持替代代币;但是,它仅在中支持。此模式附带许多优点,因此应始终使用 要启用它,请将/permissive-传递给编译器 下面的答案已过时。现在支持此选项,请参见上文! 以前,我认为 \includeof(或ciso646)是我们支持这些关键字的方式 因为“没有人”(在我

VS是不合格的,这是老消息

使用替代令牌,包括<代码> <代码>标题。根据标准,包括这个头在C++中不起作用。然而,您确实需要它。因此,无论何时您有可能编译vs.

现代Visual Studio(或更确切地说,MSVC),它总是安全的。确实支持替代代币;但是,它仅在中支持。此模式附带许多优点,因此应始终使用

要启用它,请将
/permissive-
传递给编译器


下面的答案已过时。现在支持此选项,请参见上文!

以前,我认为

\include
of
(或
ciso646
)是我们支持这些关键字的方式

因为“没有人”(在我之前,2007年)曾要求这样做


1链接目前已失效;为了文件目的而离开这里。

你问了这个原理。这里有一个可能的原因,不一定是影响VisualC++团队的一个原因:

  • 这些是C语言中的有效标识符
  • 微软的建议长期以来一直使用C++模式来同时实现C和C++代码,而不是维护一个现代的C编译器。
  • 使用这些作为标识符的有效C代码,如果将它们编译为关键字,则会无偿中断
  • <> LI>编写便携式C++的人大多使用<代码> /许可> <代码>或<代码> /ZA/COD>以最大程度一致性,这将导致这些被视为关键字。
  • /Ze
    中,通过包含头文件将它们视为关键字的变通方法简单且可移植。(G++的变通方法
    -fno操作符名称
    也不错,但将选项放在源代码中而不是放在构建系统中会更好。)
  • 正式地,这些关键字是由编译器实现的,并且在本质上不受任何标题的支持。但是,为此,您必须在C++编译器的“更标准”模式下编译源代码,这意味着使用<代码>/ZA/COD>选项>

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

    (当代更新)

    我做了一个小测试:一个新的“Windows桌面应用程序”项目。默认情况下,IDE(VisualStudio 2017)(7.7.5)设置了以下C++ C++一致性设置:<强> /PrimeTys/ZC:WCHARYT/ZC:FINSECT/ZC++:INSLINE 。此外,我将<>强> C++语言标准设置为<强> ISOC++/最新草案>(目前使用C++17)。此外,我在main()中添加了以下两行:

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

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


    默认情况下启用的/Ze编译器选项启用Microsoft扩展。/Ze选项不推荐使用,因为其行为默认为启用。/Zc(一致性)编译器选项来控制特定的语言扩展功能。

    错误消息到底是什么?我想知道为什么。这不可能是实现的复杂性,如果他们害怕破坏旧代码,gcc等也应该如此。简单的grep/replace可以解决他们的任何代码库冲突,那么还有更深层次的原因吗是否有一场幕后纠纷,或者只是一个没有人愿意问的功能?@NikosAthanasiou一个简单的grep/replace可能会搞乱很多评论。GCC通常比MSVC更傲慢地以标准一致性的名义打破旧代码。没有回答这个问题,那就是“为什么?”@Ben Voigt:嗯,它认为“为什么”部分来自“为什么不实现?”。这个问题基于一个不正确的前提,因为它们实际上是实现的。“扩展”是让程序员将这些名称作为标识符。@Ben Voigt:是的,但“扩展”的正式定义是“明确表示不允许扩展破坏任何兼容代码。换句话说,真正的扩展允许“定义标准未定义的内容”,但不允许“定义(或重新定义)标准已定义的内容”。从形式上讲,扩展可以扩展可编译代码的域,但不允许缩小它。遗憾的是,这实际上不是我的选择,因为它会导致标准头中的许多错误,例如
    winnt.h(12723):错误C2467:匿名“struct”的非法声明。
    。正如已经指出的,这是“不一致性”仅特定于默认编译设置。大多数(如果不是全部)编译器在默认模式下不一致。使用C++11或更高版本指定
    /Za
    选项可从VS compiler.gcc中删除此不一致项,而不使用-pthreads选项是另一个很好的示例。请修改
    /Za
    部分,好吗?显然这是一个非常错误的问题,Microsoft di
    bool a, b, c;
    
    a = b and c;