c++ 编译器表示为逻辑标识符,但未定义标识符

cx6n0qe3  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(340)

我在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

这些错误中的每一个都很奇怪。我以前从未遇到过,我以前也从未问过一个问题,因为我总是能够不问就找到我的答案,但在这一个上我真的被难住了。

j9per5c4

j9per5c41#

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

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

与C不同的是,C不提供这些关键字,而是提供了一个头文件<iso646.h>,其中包含一组宏,这些宏的名称可以扩展为这些逻辑运算符。这样做是为了支持过去没有键盘所需字符的计算机。
因为C
尽量避免宏,所以C++头等效项<ciso646>没有定义任何宏,而是作为内置关键字提供。
正如这里提到的,MSVC的新版本可能会增加一些对此的支持,但是您应该知道那些"交替操作符"很少使用,我建议您坚持使用原始的C语法。

dfty9e19

dfty9e192#

这些alternative operators<iso646.h>标头中定义为Visual C实现中的宏。它们与其他宏一起内置到 C 中。请包含此标头:

#include <iso646.h>

或者在使用Visual C编译器时使用/permissive-编译器开关进行编译。

在使用GCC进行编译时,您不需要包含上述标头。GCC实现似乎遵循alternative operators representation参考,该参考声明:
在C编程语言中,包含文件<iso646.h>中定义了相同的字作为宏,因为在C
中这些是内置在语言中的,所以<iso646.h>的C++版本以及<ciso646>没有定义任何内容。
Live example on Coliru

相关问题