编译器说合乎逻辑并且是未定义的标识符
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.
这是 Microsoft Visual C++ 编译器中的错误(功能)- 它不支持关键字 and
、and_eq
、bitand
、bitor
、compl
、not
、not_eq
、or
、or_eq
、xor
、xor_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 语法。
我在 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-
编译器开关进行编译。
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.
这是 Microsoft Visual C++ 编译器中的错误(功能)- 它不支持关键字 and
、and_eq
、bitand
、bitor
、compl
、not
、not_eq
、or
、or_eq
、xor
、xor_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 语法。