Flex 的 C 错误:缺少类型说明符?
C error with Flex: type specifier missing?
运行 下面 iTerm2 中的代码 bash。代码文件是使用 Vim.
创建的
/* just like Unix wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { chars++; lines++; }
. { chars++; }
%%
main(int argc, char **argv)
{
yylex();
printf("%8d%8d%8d\n", lines, words, chars);
}
我运行命令
$flex fb1-1.1
$cc lex.yy.c -lfl
这是错误 returns
fb1-1.1:17:1: warning: type specifier missing, defaults to 'int'
[-Wimplicit-int]
main(int argc, char **argv)
^
1 warning generated.
ld: library not found for -lfl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
编辑:现在有效。将 main() 更改为
int main(int argc, char* argv[])
同时 运行 将 -lfl 更改为 -ll
$flex fb1-1.1
$cc lex.yy.c -ll
$./a.out
this is a text
^D
1 4 15
根据评论整理(因为这比找骗子容易):
在现代 C(即本世纪的 C)中,所有函数都需要一个 return 类型,并且 main
仅有的两个合法原型是:
int main(void)
int main(int argc, char* argv[])
第一个的过时写法是int main()
.
在 Max OS 上,flex 发行版不包括 libfl.a
。它带有 libl.a
。所以使用 -ll
而不是 -lfl
。但更好的方法是通过在序言中放置以下声明来告诉 flex 不需要 yywrap
来避免此问题:
%option noyywrap
更好的是使用以下内容:
%option noinput nounput noyywrap nodefault
noinput
和 nounput
将避免 "unused function" 编译时启用警告(您应该始终这样做)。 nodefault
告诉 flex 不要插入默认操作,并在必要时发出警告。默认操作是在 stdout 上回显不匹配的字符,这通常是不受欢迎的,而且常常令人困惑。
运行 下面 iTerm2 中的代码 bash。代码文件是使用 Vim.
创建的/* just like Unix wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { chars++; lines++; }
. { chars++; }
%%
main(int argc, char **argv)
{
yylex();
printf("%8d%8d%8d\n", lines, words, chars);
}
我运行命令
$flex fb1-1.1
$cc lex.yy.c -lfl
这是错误 returns
fb1-1.1:17:1: warning: type specifier missing, defaults to 'int'
[-Wimplicit-int]
main(int argc, char **argv)
^
1 warning generated.
ld: library not found for -lfl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
编辑:现在有效。将 main() 更改为
int main(int argc, char* argv[])
同时 运行 将 -lfl 更改为 -ll
$flex fb1-1.1
$cc lex.yy.c -ll
$./a.out
this is a text
^D
1 4 15
根据评论整理(因为这比找骗子容易):
在现代 C(即本世纪的 C)中,所有函数都需要一个 return 类型,并且
main
仅有的两个合法原型是:int main(void) int main(int argc, char* argv[])
第一个的过时写法是
int main()
.在 Max OS 上,flex 发行版不包括
libfl.a
。它带有libl.a
。所以使用-ll
而不是-lfl
。但更好的方法是通过在序言中放置以下声明来告诉 flex 不需要yywrap
来避免此问题:%option noyywrap
更好的是使用以下内容:
%option noinput nounput noyywrap nodefault
noinput
和nounput
将避免 "unused function" 编译时启用警告(您应该始终这样做)。nodefault
告诉 flex 不要插入默认操作,并在必要时发出警告。默认操作是在 stdout 上回显不匹配的字符,这通常是不受欢迎的,而且常常令人困惑。