替代令牌是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
已存在很长时间,是否有理由不实施?
答案 0 :(得分:24)
你问的理由是什么。这是一个可能的原因,不一定是影响Visual C ++团队的最重要原因:
/permissive-
或/Za
来获得最大一致性,这将导致这些被视为关键字。/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)
答案 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 (一致性)编译器选项来控制特定的语言扩展功能。