【发布时间】:2021-10-03 09:51:39
【问题描述】:
我正在使用 C 语言。 我知道每个函数都有返回值(void 函数除外)。 但 C6031 警告信息仅出现在 scanf 函数中。 它不会出现在 printf 或 hello 等其他函数中(如下所示)。 为什么会出现这种现象?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int hello(void) {
printf("Hello World!");
return 10;
}
int main(void) {
int i;
scanf("%d", &i);
hello();
return 0;
}
【问题讨论】:
-
因为重要的是不要忽略
scanf()的返回值来检查它是否成功读取了一些数据并且不要使用未初始化的值导致意外行为。 -
检查
printf返回的值也相当重要,但大多数程序依赖于伴随SIGPIPE 的printf失败。大多数程序员要么对 SIGPIPE 的终止感到满意,要么不知道,要么不在乎。当他们在某个 SIGPIPE 被意外忽略的环境(例如 python 子进程)中运行他们的代码时,它突然变成了一个问题。 -
如果
printf失败,您可能几乎无法采取补救措施,但如果scanf失败,很可能是用户输入错误,程序几乎总是需要一些补救措施(比如重新提示)。这使得检查scanf成为正常功能的重要组成部分。 -
关于它是如何工作的问题:很可能在某个地方,可能在像
<stdio.h>这样的头文件中,您的环境正在使用一些非标准机制来指示哪些功能(如printf)可以安全地忽略它们的返回值,而不是应该警告哪些函数(如scanf)。 -
我重新打开了这个问题,因为副本回答了“为什么忽略 scanf 的返回值很危险”的问题,但这里的实际问题是“为什么这个警告会出现在某些函数中而不是为他人。”那可能也是重复的,但我找不到。
标签: c