在使用自定义错误处理程序的情况下,如何解决“控制到达非空函数末尾”警告?

问题描述 投票:0回答:1

考虑以下示例:

a.c

#include <stdlib.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>

char *invocation_name;

static void handle_error(const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    fprintf(stderr, "%s: ", invocation_name);
    vfprintf(stderr, fmt, args);
    puts("");
    va_end(args);
    exit(1);
}

static int open_a_file(void) {
    int fd = open("non-existent", 0);
    switch (fd) {
        default: return 0;
        case -1: handle_error("something happened"); 
    }
}

int main(int argc, char **argv)
{
    (void) argc; /* unused */
    invocation_name = argv[0];
    open_a_file();
}

这个例子有点牵强,不过这样就更小了。在真实的程序中,我有一个函数接受

int
并返回字符串表示形式,或者如果
int
超出范围,则退出并显示错误。

当我编译它时:

$ gcc -Wall -Wextra -pedantic -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -std=c99 -O3 \
    a.c
a.c: In function 'open_a_file':
a.c:24:1: warning: control reaches end of non-void function [-Wreturn-type]
   24 | }
      | ^

如何让

gcc
快乐?

c gcc warnings compiler-warnings gcc-warning
1个回答
0
投票

如果您使用

handle_error()
 声明 
_Noreturn
,警告将会消失:

_Noreturn static void handle_error(const char* fmt, ...) {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.