为什么这个C代码在Codeblocks中编译,而在Visual Studio中不编译?

Chr*_*ris 2 c c++ codeblocks visual-studio visual-studio-2017

当我尝试使用默认的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;
}
Run Code Online (Sandbox Code Playgroud)

我得到错误:

预期标识符:行6,25

预期";":行25

Intellisense突出显示这些行,不会让我运行代码.然而在Codeblocks中(使用默认的GNU GCC编译器,来自mingW),这个EXACT代码编译得很好.是什么造成的?

多个消息来源告诉我,这不是由于Codeblocks使用GCC编译器和Visual Studio默认使用"cl"编译器.

相同的消息来源告诉我,这也不是因为每个IDE使用不同的C标准编译代码的可能性.

我将文件扩展名命名为".c",我得到了这些错误

如果我尝试将代码编译为c ++(或作为".c ++"文件,它可以工作,但这不是我想要的.我想要C.

由于其外观时尚和菜单布局,我更喜欢使用Visual Studio而不是Codeblocks.我也更喜欢Visual Studio调试器.

在Visual Studio 2017上成功编译这个简单代码可以采取哪些步骤?

Sto*_*ica 13

微软有一个众所周知的max.如果宏定义因任何原因被拉入您的源代码,令牌替换将造成严重破坏.我打赌的结果就是你所看到的.主要是因为你自己承认,它只发生在Visual Studio中.

解决方案(并对其进行测试)非常简单.其中一个应该"修复"你的代码:

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

除此之外,你将不得不修改你的项目设置,看看可能设置不当.这不是应该在简单的控制台项目中自动添加的宏.