次の警告を受け取らずに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);
}
警告を削除するにはどうすればよいですか?
strdup
もfileno
もISOC関数ではなく、POSIXの一部です。
現在、それらがプラットフォームで利用可能かどうかは、プラットフォームによって異なります。
Microsoftツールを使用している場合は、後者について _fileno
を調べることをお勧めします( fileno
は非推奨になりました VC2005で)。 strdup
のかなり優れたバージョンが見つかります ここ 。
私自身のホーンをそのコードで吹き飛ばしましたが、 また-非推奨のstrdup
:-)を置き換えるので、 _strdup
を使用することもできます。
これらは、すでに使用しているインクルードファイルの2つであるstdio.h
とstring.h
にあるため、そのままで問題なく動作するはずです。
UNIX派生物を使用している場合、これらの関数はstdio.h
(fileno
の場合)およびstring.h
(strdup
の場合)で使用できるはずです。すでにそれらのファイルが含まれているように見えることを考えると、問題は他の場所にある可能性があります。
1つの可能性は、どちらも定義されない__STRICT_ANSI__
in gcc)のような厳密なモードの1つでコンパイルしている場合です。
生成されたLex.yy.c
ファイルとLex.l
ファイルの上部を見て、ヘッダーファイルが含まれていることを確認する必要があります。また、コンパイラに渡すコマンドラインパラメータも確認してください。
このオプションをお勧めします(POSIXを使用しているコンパイラーに伝えてください):
#define _POSIX_C_SOURCE 1
近年、機能制御が強化されているようです。一貫性が良好で広範囲に及ぶ場合は、自動作成のゴミを捨てることができれば幸いです。
次の行を追加することを検討してください。
extern char *strdup(const char *s);
-std=c99 -pedantic -pedantic-errors
でコンパイルしたときに問題に直面しました。上記の行を追加すると、問題が解決しました。
フレックスを使用しているときにもこの問題が発生しました。
問題を解決した-std=gnu99
ではなく-std=c99
を使用しました。
flex lang.l && gcc -o lexer -std=gnu99 Lex.yy.c -lfl
関数を使用する前に宣言します。
//declare the function
int storeLexeme();
//use the function here
または、関数が宣言されているヘッダーを含めます。
Cは、宣言されていない関数の戻り値の型がint
であると暗黙的に想定し、関数の呼び出し方法からパラメーターを推測します。これはC++では非推奨です。