考虑以下示例:
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
快乐?
如果您使用
handle_error()
声明
_Noreturn
,警告将会消失:
_Noreturn static void handle_error(const char* fmt, ...) {
...
}