如果未设置_GNU_SOURCE,如何在flex规则中使用asprintf?

时间:2016-01-04 17:19:58

标签: c flex-lexer

为了确保asprintf函数在头文件<stdio.h>中可见,我已按照手册页的建议进行了操作:

#define _GNU_SOURCE
#include <stdio.h>
// ... uses of asprintf();

这适用于普通的C程序,虽然可能只在GNU / Linux上而不在BSD上。

我希望能够在flex lexer中使用相同的技巧,例如:

%{
#define _GNU_SOURCE
#include <stdio.h>
%}

%%

\"[^\"].+\" {
  asprintf(&(yylval.string), "%s", yytext);
  return STRING;
}

%%

// ...

但我收到implicit-function-declaration的编译警告(asprintf)。

经过进一步调查,这是因为在我生成的C文件中,我的前导代码之前包含<stdio.h>,而不是首先定义_GNU_SOURCE。

如何编写使用此功能的代码

  • 在弹性规则中正确编译,
  • 可选)也适用于非GNU环境?

1 个答案:

答案 0 :(得分:2)

重新检查the book让我养成使用asprintf的习惯,我发现它确实是一个GNU扩展。

它可以在名为libiberty的GCC库中找到,您可以使用它来代替_GNU_SOURCE宏。

我可以使用以下命令在Ubuntu 15.10和Debian 8.2上安装它:

sudo apt-get install libiberty-dev

然后我修改了序言以包括:

%{
#include <libiberty/libiberty.h>
%}

一切都没有任何警告。

假设libiberty软件包可用于非Linux发行版(并且鉴于它是GCC的一部分,我认为会是这种情况),这个解决方案应该跨平台工作(在POSIX-ish操作系统上)。