【问题标题】:Why does this C code compile in Codeblocks, but not in Visual Studio?为什么这段 C 代码可以在 Codeblocks 中编译,而不是在 Visual Studio 中?
【发布时间】:2018-12-03 02:41:06
【问题描述】:

当我尝试在 Visual Studio 2017 上使用默认 C/C++ 设置编译以下 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 会突出显示这些行,并且不会让我运行代码。然而在 Codeblocks(使用来自 mingW 的默认 GNU GCC 编译器)中,这个 EXACT 代码编译得很好。这是什么原因造成的?

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

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

我已将文件扩展名命名为“.c”,但出现这些错误

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

我更喜欢使用 Visual Studio 而不是 Codeblocks,因为它具有时尚的外观和菜单布局。我也更喜欢 Visual Studio 调试器。

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

【问题讨论】:

  • 对于 C 程序,它至少应该是 int main(void)
  • @Chris - 与您的问题无关,但您可能希望添加一个测试用例,以使 num2 成为最大数字。喜欢max(1, 2, 1);
  • @alk,为什么? “如果没有给出参数,则函数不接受任何参数,应使用 空括号集 或关键字 void 来定义。” www-s.acm.illinois.edu/webmonkeys/book/c_guide/1.3.html
  • @purce:在 C 中,“一个空的括号集定义了一个空的参数列表。这只是 C 和 C++ 之间的本质区别。不幸的是,您链接的文档在这里似乎不准确(不要说错)。
  • 如何将任何东西传递给 main()?

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


【解决方案1】:

Microsoft 有一个臭名昭著的定义 max macro。如果由于某种原因将宏定义拉入您的源代码,则令牌替换将造成严重破坏。我敢打赌的结果就是你所看到的。主要是因为您自己承认,它只发生在 Visual Studio 中。

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

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

除此之外,您还必须修改您的项目设置,看看哪些设置可能不正确。这不是一个应该自动添加到简单控制台项目中的宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2010-10-24
    • 2012-11-18
    相关资源
    最近更新 更多