我在Mac上学习了C++,最近转到了Windows 7。我下载了Windows 7. 1 SDK并运行了安装程序。它是SDK的.net 4依赖版本,我已经安装了.net 4。
我使用命令行是因为我更喜欢使用它,我在Mac上用GCC编译器做了这件事,考虑到我对编程还很陌生,我对它做得很好。
我一直在使用v7.1 sdk开发人员命令提示符,因为它使用SetEnv批处理文件设置环境变量。
该编译器显然是Microsoft的cl.exe编译器。
我运行了一个典型的非常简单的hello world程序,在最后包含了一个getchar(),让我可以看到程序,这是一个新的东西,因为mac不需要这个,getchar运行得很好,程序编译和运行得很好。
这个问题是在我试图编译我在mac上写的一些源代码时出现的。顺便说一句,在mac上编译得很好。它开始抛出一些非常奇怪的错误,比如告诉我逻辑“and”运算符是一个未定义的标识符。现在我可能是愚蠢的一个,但从我的理解来看,and运算符不是一个标识符,它是一个运算符。
所以我决定通过编写一个非常简单的程序来缩小问题的范围,这个程序使用了一个if语句和一个else语句以及“and”操作符,看看会发生什么。
//hello, this is a test
#include <iostream>
int main()
{
char end;
int a = 0, b = 0;
std::cout << "If the variable a is larger than 10 and variable b is less than a, then b will be subtracted from a, else they are added.\n";
std::cout << "Enter a number for variable a\n";
std::cin >> a;
std::cout << "Now enter a number for variable b\n";
std::cin >> b;
if (a>10 and b<a) a - b;
else a+b;
std::cout << "The value of a is: " <<a;
std::cout << "Press any key to exit";
end = getchar();
return 0;
}
这是我用来编译程序的命令
cl /EHsc main.cpp
最后但肯定不是最不重要的,这个程序引发的错误列表,为什么这些错误在这里,我不确定,对我来说没有任何意义。
main.cpp
error C2146: syntax error : missing ')' before identifier 'and'
error C2065: 'and' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'b'
error C2059: syntax error : ')'
error C2146: syntax error : missing ';' before identifier 'a'
warning C4552: '<' : operator has no effect; expected operator with side-effect
warning C4552: '-' : operator has no effect; expected operator with side-effect
error C2181: illegal else without matching if
warning C4552: '+' : operator has no effect; expected operator with side-effect
这些错误中的每一个都很奇怪。我以前从未遇到过,我以前也从未问过一个问题,因为我总是能够不问就找到我的答案,但在这一个上我真的被难住了。
2条答案
按热度按时间j9per5c41#
这是一个错误(Microsoft Visual C++编译器中的一项功能)-它不支持关键字
and
、and_eq
、bitand
、bitor
、compl
、not
、not_eq
、or
、or_eq
、xor
、xor_eq
。您应该使用更常用的运算符,如&&
代替and
,||
代替or
等。等效表:与C不同的是,C不提供这些关键字,而是提供了一个头文件
<iso646.h>
,其中包含一组宏,这些宏的名称可以扩展为这些逻辑运算符。这样做是为了支持过去没有键盘所需字符的计算机。因为C尽量避免宏,所以C++头等效项
<ciso646>
没有定义任何宏,而是作为内置关键字提供。正如这里提到的,MSVC的新版本可能会增加一些对此的支持,但是您应该知道那些"交替操作符"很少使用,我建议您坚持使用原始的C语法。
dfty9e192#
这些alternative operators在
<iso646.h>
标头中定义为Visual C实现中的宏。它们与其他宏一起内置到 C 中。请包含此标头:或者在使用Visual C编译器时使用
/permissive-
编译器开关进行编译。在使用GCC进行编译时,您不需要包含上述标头。GCC实现似乎遵循alternative operators representation参考,该参考声明:
在C编程语言中,包含文件
<iso646.h>
中定义了相同的字作为宏,因为在C中这些是内置在语言中的,所以<iso646.h>
的C++版本以及<ciso646>
没有定义任何内容。Live example on Coliru