当我尝试使用默认C / C ++设置在Visual Studio 2017上编译以下C代码时:
#include <stdio.h>
#include <stdlib.h>
/* function declaration */
/*Line 6*/ int max(int num1, int num2, int num3);
int main() {
/* local variable definition */
int a = 100;
int b = 200;
int c = 400;
int ret;
/* calling a function to get max value */
ret = max(a, b, c);
printf("Max value is : %d\n", ret);
return 0;
}
/* function returning the max between two numbers */
/*Line 25*/ int max(int num1, int num2, int num3) {
/* local variable declaration */
int result;
if (num1 > num2)
result = num1;
else
result = num3;
return result;
}
我收到错误:
期望一个标识符:行6,25
预期为“;”:第25行
Intellisense突出显示了这些行,并且不会让我运行代码。但是在代码块中(使用mingW的默认GNU GCC编译器),此EXACT代码可以很好地编译。是什么原因造成的?
多个消息来源告诉我,这不是由于使用GCC编译器的代码块 和Visual Studio默认使用“ cl”编译器。
相同的消息来源告诉我,这也不是因为每个IDE都可能使用不同的C标准来编译代码。
我将文件扩展名命名为“ .c”,但出现这些错误
如果我尝试将代码编译为c ++(或作为“ .c ++”文件),则可以工作,但这不是我想要的。 我要C。
由于其时尚的外观和菜单布局,我宁愿使用Visual Studio而非Codeblock。我也更喜欢Visual Studio调试器。
我可以采取哪些步骤在Visual Studio 2017上成功编译此简单代码?
答案 0 :(得分:13)
Microsoft臭名昭著地定义了max
macro。如果出于任何原因将宏定义拖入源中,则令牌替换将造成严重破坏。我下注的结果就是您所看到的。主要是因为您自己承认,它仅在Visual Studio中发生。
解决方案(并对其进行测试)非常简单。其中之一应“修复”您的代码:
max
重命名为其他名称,例如my_max
。#define NOMINMAX
以禁止在任何包含的MS标头中定义宏。除此之外,您还必须修改项目设置,并查看可能设置不正确的内容。这不是应该在简单的控制台项目中自动添加的宏。