Как удалить следующие предупреждения "неявное объявление функции"?
Как скомпилировать 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
и выводят параметры из того, как вы вызываете эту функцию. Это устарело в С++.