编译器说合乎逻辑并且是未定义的标识符

Compiler says logical and is undefined identifier

我在 mac 上学习了 c++,最近 运行 转到了 windows 7。我下载了 windows v7.1 sdk 和 运行 安装程序。它是 .net 4 依赖版本的 sdk,我安装了 .net 4。

我正在使用命令行,因为我更喜欢使用它,我在 mac 上使用 gcc 编译器做到了这一点,考虑到我对编程还很陌生,所以我非常擅长它。

我一直在使用 v7.1 sdk 开发人员命令提示符,因为它使用 SetEnv 批处理文件设置环境变量。

编译器显然是微软的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

这些错误中的每一个都很奇怪。我从来没有遇到过,也从来没有问过问题,因为我总是不问就能找到答案,但是在这个问题上我真的很困惑。

这些 alternative operators<iso646.h> header 中定义为 Visual C++ 实现中的宏。它们与其他语言一起内置到 C++ 语言中。包括这个 header:

#include <iso646.h>

或在使用 Visual C++ 编译器时使用 /permisive- 编译器开关进行编译。 使用 GCC 编译时不需要包含上面的 header。 GCC 实现似乎尊重 alternative operators representation 参考,其中指出:

The same words are defined in the C programming language in the include file <iso646.h> as macros. Because in C++ these are built into the language, the C++ version of <iso646.h>, as well as <ciso646>, does not define anything.

Live example on Coliru

这是 Microsoft Visual C++ 编译器中的错误(功能)- 它不支持关键字 andand_eqbitandbitorcomplnotnot_eqoror_eqxorxor_eq。您应该使用更常用的运算符,例如 && 而不是 and|| 而不是 or 等。等价 table:

+--------+-------+
| and    |  &&   |
| and_eq |  &=   |
| bitand |  &    |
| bitor  |  |    |
| compl  |  ~    |
| not    |  !    |
| not_eq |  !=   |
| or     |  ||   |
| or_eq  |  |=   |
| xor    |  ^    |
| xor_eq |  ^=   |
+--------+-------+

与 C++ 不同,C 不提供这些关键字,而是提供 header <iso646.h> 和一组宏,这些宏的名称扩展为那些逻辑运算符。这样做是为了为过去键盘上没有所需字符的机器提供支持。

因为 C++ 尽量避免宏,C++ header 等价物 <ciso646> 不定义任何宏,而是作为内置关键字提供。

如此处所述,较新版本的 MSVC 可能会为此添加一些支持,但您应该知道这些 "altenative operators" 很少使用。我建议您坚持使用原始的 C 语法。