Как удалить следующие предупреждения "неявное объявление функции"?

Как скомпилировать lex файл с помощью gcc без получения следующих предупреждений?

lex.yy.c: In function `yy_init_buffer':
lex.yy.c:1688: warning: implicit declaration of function `fileno'
lex.l: In function `storeLexeme':
lex.l:134: warning: implicit declaration of function `strdup'

Это библиотеки, которые я включил.

%{
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
%}

Функция yy_init_buffer отсутствует в файле. Ниже приведена функция storeLexeme.

 int storeLexeme() {
for (int i = 0; i < count; i++) {
    char *curr = *(symbolTable + i); 
    if (strcmp(curr, yytext) == 0) {
        return i;
    }
}
char *lexeme = (char *)malloc(sizeof(char *));
lexeme = (char *)strdup(yytext);
symbolTable[count] = lexeme;
count++;
return (count - 1);
 }

Как удалить предупреждения?

Ответ 1

Ни strdup, ни fileno не являются функциями ISO C, они являются частью POSIX.

Теперь, доступны ли они на вашей платформе, зависит от вашей платформы.


Если вы используете инструменты Microsoft, вы можете посмотреть в _fileno для последнего (fileno был устаревшим в VC2005). Здесь можно найти довольно отличную версию strdup .

Хотя, взорвав свой собственный рог с этим кодом, вы также можете использовать _strdup, поскольку он заменяет тоже-устаревший strdup: -)

Они, надеюсь, будут работать нормально, поскольку они находятся в stdio.h и string.h, двух из включенных файлов, которые вы уже используете.


Если вы используете производную UNIX, эти функции должны быть доступны в stdio.h (для fileno) и string.h (для strdup). Учитывая, что похоже, что вы уже включаете эти файлы, проблема, скорее всего, в другом месте.

Одна из возможностей заключается в компиляции в одном из строгих режимов, таких как __STRICT_ANSI__ в gcc), где ни один из них не будет определен.

Вы должны взглянуть вверху сгенерированных файлов lex.yy.c и lex.l, чтобы подтвердить, что файлы заголовков включены, а также проверить параметры командной строки, которые вы передаете компилятору.

Ответ 2

Я предлагаю эту опцию (скажите компилятору, что вы используете POSIX):

#define _POSIX_C_SOURCE 1

Люди, похоже, в последние годы ужесточили контроль над элементами, и, надеюсь, когда последовательность будет хорошей и широко распространенной, мы можем выбросить мусорный мусор.

Ответ 3

Рассмотрим добавление следующей строки:

extern char *strdup(const char *s);

Я столкнулся с проблемой, когда скомпилировал -std=c99 -pedantic -pedantic-errors. Добавление вышеуказанной строки помогло мне решить проблему.

Ответ 4

У меня также была эта проблема при использовании flex.

Я использовал -std=gnu99 вместо -std=c99, который решил проблему.

flex lang.l && gcc -o lexer -std=gnu99 lex.yy.c -lfl                         

Ответ 5

Вы объявляете функцию перед ее использованием:

//declare the function
int storeLexeme();

//use the function here

или включить заголовок, в котором объявлена ​​функция.

C подразумевает, что необъявленные функции имеют тип возврата int и выводят параметры из того, как вы вызываете эту функцию. Это устарело в С++.