Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
警告:忽略返回值';scanf';,用属性warn\u unused\u result声明 #包括 int main(){ int t; scanf(“%d”、&t); printf(“%d”,t); 返回0; }_C - Fatal编程技术网

警告:忽略返回值';scanf';,用属性warn\u unused\u result声明 #包括 int main(){ int t; scanf(“%d”、&t); printf(“%d”,t); 返回0; }

警告:忽略返回值';scanf';,用属性warn\u unused\u result声明 #包括 int main(){ int t; scanf(“%d”、&t); printf(“%d”,t); 返回0; },c,C,我使用ideone.com编译了上述C代码,并弹出以下警告: 程序c:在函数“main”中: 程序c:5:警告:忽略返回值 使用属性warn\u unused\u result声明“scanf”的 有人能帮我理解这个警告吗?您的libc的编写者决定在大多数情况下不应忽略scanf的返回值,因此他们给了它一个属性,告诉编译器给您一个警告 如果确实不需要返回值,那么就可以了。然而,通常最好检查一下,以确保您确实成功地阅读了您认为您所做的事情 在您的情况下,可以这样编写代码以避免警告(和一些输入错误)

我使用ideone.com编译了上述C代码,并弹出以下警告:

程序c:在函数“main”中:
程序c:5:警告:忽略返回值 使用属性warn\u unused\u result声明“scanf”的


有人能帮我理解这个警告吗?

您的libc的编写者决定在大多数情况下不应忽略
scanf
的返回值,因此他们给了它一个属性,告诉编译器给您一个警告

如果确实不需要返回值,那么就可以了。然而,通常最好检查一下,以确保您确实成功地阅读了您认为您所做的事情

在您的情况下,可以这样编写代码以避免警告(和一些输入错误):

#包括
int main(){
int t;
如果(扫描频率(“%d”,&t)==1){
printf(“%d”,t);
}否则{
printf(“读取整数失败。\n”);
}
返回0;
}

scanf,printf是返回值的函数,通常在这类函数中是读取或写入的字符数。如果发生错误,还可以使用返回代码捕获错误。 一个很好的编程实践是查看返回值,但是,我从来没有见过有人查看printf返回值

如果希望警告消失,可能可以更改编译器的严重性

警告(正确)表明不检查
scanf
的返回值是个坏主意。函数
scanf
已明确声明(通过gcc函数属性),如果放弃其返回值,将触发此警告

如果您真的想忘记这个返回值,同时让编译器(和您的良心)高兴,您可以将返回值强制转换为void:

#include <stdio.h>

int main() {
    int t;
    if (scanf("%d", &t) == 1) {
        printf("%d", t);
    } else {
        printf("Failed to read integer.\n");
    }
    return 0;
}

我用gcc(ubuntu4.4.3-4ubuntu5.1)4.4.3尝试了你的例子。 当且仅当优化时(例如使用选项-O2或-O3)才会发出警告。 请求所有警告(-Wall)并不重要。 “强制作废”这一经典成语没有任何效果,它不会抑制警告

我可以通过写信使警告保持沉默

(void)scanf("%d",&t);
这行得通,但对我来说有点晦涩难懂。空{}避免另一个警告-Wempty body

执行以下操作:

if(scanf("%d",&t)){};

解决此问题的一种方法是使用
IGUR()
函数,如下所示。非常难看,但是有点便携。(对于不理解
内联
的旧编译器,只需
#像往常一样定义内联/*nothing*/
。)

#包括
#包括
#包括
内联void IGUR(){}/*忽略GCC未使用的结果*/
void IGUR();/*看见https://stackoverflow.com/a/16245669/490291 */
int
主(内部argc,字符**argv)
{
char buf[10*BUFSIZ];
int-got,fl,have;
fl=fcntl(0,F_GETFL);
fcntl(0,F_设置fl,fl | O_非块);
have=0;
而((got=read(0,buf,sizeof buf))>0)
{
IGUR(write(1,buf,got));
have=1;
}
fcntl(0,F_SETFL,fl);
还有,;
}
顺便说一句,在本例中,无阻塞地从
stdin
复制到
stdout
,直到读取所有等待的输入,如果没有任何内容,则返回
true
(0),否则返回
false
(1)。(它可以防止在
bash
中读取-t1;do:;done时出现类似
的1s延迟)

-Wall
(Debian Jessie)下编译而不发出警告

编辑:
IGUR()
也需要在不使用
inline
的情况下定义,以便链接器可以使用它。否则使用cc-O0时可能会失败。见:


Edit2:Newer
gcc
要求
inline
void
之前,实际上这取决于您需要什么,如果您只是想禁用编译器的警告,您可以通过强制转换忽略函数的返回值,也可以直接处理它,
scanf
功能的含义是用户输入的计数

==更新====

你可以用

(void)scanf(“%d”和&t)


在阅读了本页上的所有答案和评论后,要忽略scanf的返回值,我看不到避免警告的其他选项:

使用
gcc
编译时,可以将以下内容添加到命令行:

gcc-Wall-Wextra-Wno未使用结果程序c-o程序x

另一个选项是使用
-O0
,因为“优化级别0”忽略警告

当使用
gcc

如果调试代码,您可以始终使用
assert()
,如下例所示:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

inline void IGUR() {}  /* Ignore GCC Unused Result */
void IGUR();  /* see https://stackoverflow.com/a/16245669/490291 */

int
main(int argc, char **argv)
{
  char  buf[10*BUFSIZ];
  int   got, fl, have;

  fl    = fcntl(0, F_GETFL);
  fcntl(0, F_SETFL, fl|O_NONBLOCK);
  have = 0;
  while ((got=read(0, buf, sizeof buf))>0)
    {
      IGUR(write(1, buf, got));
      have = 1;
    }
  fcntl(0, F_SETFL, fl);
  return have;
}
但是现在,如果您通过
#define NDEBUG
关闭assert,您将得到一个
-wused但set变量。然后,您可以通过以下两种方式之一关闭第二次警告:

  • -Wno未使用但设置变量
    添加到
    gcc
    命令行,或
  • 声明具有以下属性的变量:
    intu\uu属性(未使用))
  • 正如在另一个答案中指出的那样,不幸的是,第二个选项不是很便于携带,尽管它似乎是最好的选项

    最后,定义的如果您确定要忽略给定函数的返回,但关闭所有未使用函数返回的警告并不舒服,则以下定义的宏可以帮助您:

    u = scanf("%d", &t);
    assert(u == 1);
    


    另请参见

    由于没有参数的函数在C中有效,因此可以执行以下操作:

    #define igr(x) {__typeof__(x) __attribute__((unused)) d=(x);} 
    
    double __attribute__ ((warn_unused_result)) fa(void) {return 2.2;}
    igr(fa());
    
    #包括
    静态内联void ignore_ret(){}
    int main(){
    int t;
    忽略_ret(scanf(“%d”和&t));
    返回0;
    }
    
    有人能帮他吗
    u = scanf("%d", &t);
    assert(u == 1);
    
    #define igr(x) {__typeof__(x) __attribute__((unused)) d=(x);} 
    
    double __attribute__ ((warn_unused_result)) fa(void) {return 2.2;}
    igr(fa());
    
    #include <stdio.h>
    
    static inline void ignore_ret() {}
    
    int main() {
       int t;
       ignore_ret(scanf("%d", &t));
       return 0;
    }
    
    [&]{ return scanf("%d", &t); }();