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 

根据评论整理(因为这比找骗子容易):

  1. 在现代 C(即本世纪的 C)中,所有函数都需要一个 return 类型,并且 main 仅有的两个合法原型是:

    int main(void)
    
    int main(int argc, char* argv[])
    

    第一个的过时写法是int main().

  2. 在 Max OS 上,flex 发行版不包括 libfl.a。它带有 libl.a。所以使用 -ll 而不是 -lfl。但更好的方法是通过在序言中放置以下声明来告诉 flex 不需要 yywrap 来避免此问题:

    %option noyywrap
    

    更好的是使用以下内容:

    %option noinput nounput noyywrap nodefault
    

    noinputnounput 将避免 "unused function" 编译时启用警告(您应该始终这样做)。 nodefault 告诉 flex 不要插入默认操作,并在必要时发出警告。默认操作是在 stdout 上回显不匹配的字符,这通常是不受欢迎的,而且常常令人困惑。