C flex错误:类型指定符缺失



在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%8dn", lines, words, chars);
}

我运行命令

$flex fb1-1.1
$cc lex.yy.c -lfl

这是它返回的错误

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)

编辑:现在工作。将主()更改为

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 

从注释中组装(因为比找到dupe容易):

  1. 在现代C中(即本世纪的C),所有功能都需要返回类型,而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启用警告时,将避免"未使用的功能"警告(您应该始终执行)。nodefault告诉FLEX不要插入默认操作,并在需要警告的情况下发出警告。默认的动作是在Stdout上呼应无与伦比的字符,这通常是不受欢迎的且经常令人困惑的。

最新更新