不确定编译器为什么抱怨...函数strchrnul的隐式声明

时间:2013-06-03 18:22:08

标签: 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));
}

我正在通过这条线,并且摆脱了前导和尾随空格以及在'#'之后发生的任何事情(包括'#')。

我的编译器这样说:

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]

虽然我上面有string.h

有人可以解释一下。

2 个答案:

答案 0 :(得分:4)

如果您使用的是gcc编译器,请不要使用-std=c89-std=c99,而是使用-std=gnu89-std=gnu99作为strchrnul GNU扩展。

答案 1 :(得分:4)

strchrnul()是一个GNU扩展程序,您可以通过feature test macro免费提供此功能。

#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));
}

请注意,在第二个链接的手册页中,#define的展示位置非常重要:

  

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