【问题标题】:C error with Flex: type specifier missing?Flex 的 C 错误:缺少类型说明符?
【发布时间】:2017-11-28 05:17:17
【问题描述】:

在 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

这是它返回的错误

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 

【问题讨论】:

  • main 是一个函数。函数必须指定返回类型。说真的,为什么这么多问题都有这个完全相同的问题?谁在教这种古老的 C 方言?
  • int main。但是你也缺少 flex 运行时库,所以你的程序没有链接!
  • 在 Mac OS 附带的 flex 发行版上,您必须使用 -ll 而不是 -lfl 链接。但是通过将%option noyywrap 放在 flex 文件的开头可以更容易地避免这个问题。那么你就不需要任何库了。
  • 找到这个link
  • 谢谢 rici。还将程序编辑为“int main(int argh, char **argv)”,但现在 bash 中没有输出? @AnttiHaapala

标签: c flex-lexer


【解决方案1】:

由 cmets 组装而成(因为它比找到骗子更容易):

  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 上回显不匹配的字符,这通常是不可取的并且经常令人困惑。

【讨论】:

  • @antti:在定义中,()(void) 的含义完全相同(第 6.7.6.3p14 节)。并且 main 不能在没有定义的情况下声明。所以我已经确信int main() {…} 很好:) 标准中的三个示例中有两个使用int main()
  • 谢谢。 MacOS 如何解释 './a.out' ?我的命令不再给我错误,所以我在它们之后运行'.a.out',但没有打印。我期待一个输出,但我的 bash 坐在那里,直到我点击 ^C
  • @rici 是的,但int main() 没有声明原型。这意味着编译器不需要对递归调用 main 进行约束检查;)
  • @user:它正在等待您输入内容,然后是输入结束(在操作系统上为 control-z/control-d deoending)。
  • @antti:我不认为这是正确的。定义也是声明。 " 作为该函数定义一部分的函数声明符中的空列表指定该函数没有参数。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多