2017-11-25 35 views
-1

我在Mac上学习了C++,并且最近转移到了Windows 7上。我下载了windows v7.1 sdk并运行了安装程序。它的.net 4依赖版本的sdk,并且我安装了.net 4。编译器说逻辑,并且是未定义的标识符

我正在使用命令行,因为我更喜欢使用它,我使用gcc编译器在Mac上做了这个,因为我对编程非常陌生,所以我非常善于使用它。

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

编译器显然是来自Microsoft的cl.exe编译器。

我运行了典型的非常简单的hello world程序,其中包括一个getchar()结束让我真正看到程序,因为mac不需要这个新东西。而且getchar工作得很好,程序编译并运行良好。

当我尝试编译我在Mac上编写的一些源代码时,出现问题。顺便说一句,在Mac上编译好了。它开始抛出一些非常奇怪的错误,比如告诉我逻辑'和'操作符是一个未定义的标识符。现在我可能在这里是一个愚蠢的人,但从我的理解来看,和运算符不是一个标识符,它是一个运算符。

因此,我决定通过编写一个非常简单的程序来缩小问题范围,该程序使用一个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

'a + b'和'a-b'加减两个变量,但不会对结果做任何事情。它们是没有任何副作用的语句,例如将结果存储在变量中或传递给函数调用,所以它们不会影响程序流。事实上,你的编译器可能会将它们完全从程序中删除,因为它们的存在或缺失根本不会影响程序。 – Frxstrem

+2

不要采取这种错误的方式,但你真的不需要这么长的解释来解释你的问题。信息的信噪比并不是那么好。 – StoryTeller

+0

你意识到这一点,是&C在C + +?如果在Mac上编译的代码,他们真的有线编译器那里... – anhoppe

回答

5

这是在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语法。

+0

哈哈,我是涂料。我认为我的编译器决定无缘无故地假发。我应该考虑尝试定义运营商的标准方式。我在发布代码后也陷入了一阵混乱,我从未更新过基于if和else语句的值。这解释了“操作员无效”错误。有趣的是,我以前从未在我的任何程序中做过这件事。而我刚刚注意到这里有人指出这个错误,我不能相信我错过了它,并将它贴在这里。哦,让你保持谦虚。 – JoshD

+0

@JoshD如果一个答案解决了你的问题,那么你应该接受它。 – tambre

+0

谢谢你,因为你可以告诉我新堆栈溢出,我试图找到一种方法来关闭讨论或标记为已解决。当然,我必须做一些其他需要我注意的事情。我知道了,所以如果我需要再次提出问题,我会知道如何接受答案。 – JoshD

1

这些alternative operators<iso646.h>标题中定义为Visual C++实现中的宏。他们与其他人一起构建到C++语言中。或者包括此标头:

#include <iso646.h> 

或使用Visual C++编译器当与/permisive-编译器开关编译。 Permissive compiler switch 使用GCC进行编译时,不需要包含上述头文件。海湾合作委员会实现似乎尊重alternative operators representation参考其中规定:

同样的话在C编程语言定义中包含文件<iso646.h>为宏。因为在C++中,这些内置语言,C++版本<iso646.h>以及<ciso646>不定义任何内容。

Live example on Coliru

+0

它们也被定义为'permissive-'编译器开关,它将在VS的未来版本中默认使用,并且应该首先为每个新项目开启。 –

+0

@Revolver_Ocelot我已根据您的输入更新了答案。 – Ron

+0

您应该真正链接到[cppreference页面](http://en.cppreference.com/w/cpp/language/operator_alternative)的C++版本,而不是C版本。 – tambre