web-dev-qa-db-ja.com

次の「関数の暗黙の宣言」警告を削除するにはどうすればよいですか?

次の警告を受け取らずにgccでLexファイルをコンパイルするにはどうすればよいですか?

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

警告を削除するにはどうすればよいですか?

12
idealistikz

strdupfilenoもISOC関数ではなく、POSIXの一部です。

現在、それらがプラットフォームで利用可能かどうかは、プラットフォームによって異なります。


Microsoftツールを使用している場合は、後者について _fileno を調べることをお勧めします( filenoは非推奨になりました VC2005で)。 strdupのかなり優れたバージョンが見つかります ここ

私自身のホーンをそのコードで吹き飛ばしましたが、 また-非推奨のstrdup :-)を置き換えるので、 _strdup を使用することもできます。

これらは、すでに使用しているインクルードファイルの2つであるstdio.hstring.hにあるため、そのままで問題なく動作するはずです。


UNIX派生物を使用している場合、これらの関数はstdio.hfilenoの場合)およびstring.hstrdupの場合)で使用できるはずです。すでにそれらのファイルが含まれているように見えることを考えると、問題は他の場所にある可能性があります。

1つの可能性は、どちらも定義されない__STRICT_ANSI__ in gcc)のような厳密なモードの1つでコンパイルしている場合です。

生成されたLex.yy.cファイルとLex.lファイルの上部を見て、ヘッダーファイル含まれていることを確認する必要があります。また、コンパイラに渡すコマンドラインパラメータも確認してください。

11
paxdiablo

このオプションをお勧めします(POSIXを使用しているコンパイラーに伝えてください):

#define _POSIX_C_SOURCE 1

近年、機能制御が強化されているようです。一貫性が良好で広範囲に及ぶ場合は、自動作成のゴミを捨てることができれば幸いです。

9
Tel

次の行を追加することを検討してください。

extern char *strdup(const char *s);

-std=c99 -pedantic -pedantic-errorsでコンパイルしたときに問題に直面しました。上記の行を追加すると、問題が解決しました。

5
Arun

フレックスを使用しているときにもこの問題が発生しました。

問題を解決した-std=gnu99ではなく-std=c99を使用しました。

flex lang.l && gcc -o lexer -std=gnu99 Lex.yy.c -lfl                         
4
en4bz

関数を使用する前に宣言します。

//declare the function
int storeLexeme();

//use the function here

または、関数が宣言されているヘッダーを含めます。

Cは、宣言されていない関数の戻り値の型がintであると暗黙的に想定し、関数の呼び出し方法からパラメーターを推測します。これはC++では非推奨です。

0
Luchian Grigore