【问题标题】:MinGW with GCC on Windows misreporting numeric values在 Windows 上使用 GCC 的 MinGW 误报数值
【发布时间】:2015-07-17 09:34:52
【问题描述】:

出于某种原因,每当我在编译器设置中使用数值时(Windows 上的 MinGW,使用 CMD 提示符编译和运行),它都会完全误报程序中的数字。

代码示例:

//C hello world example
#include <stdio.h>

int main()
{

    int value;
    value = 10;
    printf("The number is %d \n"), value;


     int value2;
     value2 = -100;
     printf("The number is %d \n"), value2;
     return 0;
}

参照。 screenshot of output.

【问题讨论】:

  • value 里面 printf(..)

标签: c windows gcc printf mingw


【解决方案1】:

valuevalue2 必须作为参数传递,即在括号内。将其更改为以下内容:

printf("The number is %d \n", value);

value2 进行类似操作。

这再次表明使用-Wall-pedantic 进行编译很有用。 GCC 很可能会发出警告消息。

【讨论】:

  • 当你删除了另一个线程上的帖子时,我已经在这里替换了它。你做了正确的事,所以不应该因此受到惩罚
【解决方案2】:

说出来

printf("The number is %d \n"), value;

您以某种方式(错误)使用了 "comma operator" ,因此不会产生语法错误。您的打印声明被视为

printf("The number is %d \n");

valuesi 作为一个空表达式执行。

现在,printf()variadic function,它不会检查提供的格式说明符所需的参数数量(默认情况下),但是请注意,根据 printf() 所需的格式,您' 基本上错过了 %d 格式说明符的操作数。这又会调用undefined behaviour

按照标准要求

如果格式的参数不足,则行为是 未定义。

正确的语法是

 printf("The number is %d \n", value);

value 将是 %d 格式说明符的参数。

故事的寓意:启用编译器警告并注意它们。


注意:一些建议,

  1. main() 的推荐签名是 int main(int argc, char**argv),或者,至少 int main(void)
  2. 尝试养成同时定义和初始化任何变量的习惯。将使您免于在后面部分使用未初始化值(局部变量)的危险。

【讨论】:

  • main 的更推荐签名是 int main(int argc, char**argv)
  • @BasileStarynkevitch 先生,您说的很对,但只有当我们打算在我们的代码中使用argcargv 时才会有用,否则,它有点没用,不是吗?
  • 这是一个非常好的习惯。我非常喜欢GNU convention 要求同时理解--help--version。甚至我在 GNU/Linux 上的 /bin/true 也能理解它们。最后argv[0] 在错误消息中使用非常有用...所以在现实生活中main 总是 使用argcargv 所以实际上int main(void) 是错误的(即使可以接受根据一些遗留的 C 标准)!
  • 所以main 的推荐签名是not int main (void) - 这是过时和弃用的,用户不友好,无用,不应该教给新手,但遗憾的是在上个世纪是允许的 - 但真的 int main(int argc, char**argv)
  • @BasileStarynkevitch 所以你的意思是说C11“过时和弃用”标准?
猜你喜欢
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多