不知道为什么编译器会抱怨......函数 strchrnul 的隐式声明

cxz*_*xzp 4 c compiler-errors header-files compiler-warnings

这是我的代码:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

static int valid_line(char *cur_line) {
    if (*cur_line == '#') {
        return 0;
    }

    char *end = strchrnul(cur_line, '#');

    while(end > cur_line && isspace(*end)) end--;
    return (!(*cur_line == *end));
}
Run Code Online (Sandbox Code Playgroud)

我正在通过这条线并摆脱前导和尾随空格以及“#”(包括“#”)之后出现的任何内容。

我的编译器是这样说的:

parser.c:20:2: warning: implicit declaration of function ‘strchrnul’ [-Wimplicit-    function-declaration]
parser.c:20:14: warning: initialisation makes pointer from integer without a cast [enabled by default]
Run Code Online (Sandbox Code Playgroud)

即使我string.h上面有。

有人可以解释一下。

Mik*_*ike 6

strchrnul()是 GNU 扩展,您可以通过功能测试宏免费获得此功能包括警告。

#define _GNU_SOURCE  // required for strchrnul()

#include <stdio.h>
#include <ctype.h>
#include <string.h>  // required for strchrnul()
#include <stdlib.h>

static int valid_line(char *cur_line) {
    if (*cur_line == '#') {
        return 0;
    }

    char *end = strchrnul(cur_line, '#');

    while(end > cur_line && isspace(*end)) end--;
    return (!(*cur_line == *end));
}
Run Code Online (Sandbox Code Playgroud)

请注意第二个链接的手册页, 的位置#define很重要:

注意:为了有效,必须在包含任何头文件之前定义功能测试宏