2013-06-03 2 views
2

Это мой код:Не уверен, почему компилятор жалуется ... неявное объявление функции strchrnul

#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

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 важно:

ПРИМЕЧАНИЕ: Для того, чтобы быть эффективным, тест функции макрос должно быть определенно перед включением любых файлов заголовков

+1

yaaay thankyou! – cxzp

4

Если вы используете gcc компилятор, не используйте -std=c89 или -std=c99, а использовать -std=gnu89 или -std=gnu99, как strchrnul является расширением GNU.

+0

им нечего использовать ... должно ли оно по-прежнему жаловаться? – cxzp

+0

@cxzp как вы скомпилируете исходный файл? – ouah

+0

'gcc -o main main.o parser.o -Wall' as in i am using gcc, но havent устанавливает любые стандарты – cxzp

Смежные вопросы