为什么此C代码在Codeblock中而不在Visual Studio中进行编译?

时间:2018-06-24 07:49:08

标签: c++ c visual-studio visual-studio-2017 codeblocks

当我尝试使用默认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上成功编译此简单代码?

1 个答案:

答案 0 :(得分:13)

Microsoft臭名昭著地定义了max macro。如果出于任何原因将宏定义拖入源中,则令牌替换将造成严重破坏。我下注的结果就是您所看到的。主要是因为您自己承认,它仅在Visual Studio中发生。

解决方案(并对其进行测试)非常简单。其中之一应“修复”您的代码:

  1. max重命名为其他名称,例如my_max
  2. 在包含任何标头之前,添加#define NOMINMAX以禁止在任何包含的MS标头中定义宏。

除此之外,您还必须修改项目设置,并查看可能设置不正确的内容。这不是应该在简单的控制台项目中自动添加的宏。