繁体   English   中英

未设置_GNU_SOURCE时如何在Flex规则中使用asprintf?

[英]How to use asprintf in a flex rule, when _GNU_SOURCE not set?

为了确保asprintf函数在头文件<stdio.h>可见,我遵循了手册页的建议并放入:

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

尽管大概只能在GNU / Linux上,而不能在BSD上,但这可以在普通C程序中使用。

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

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

%%

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

%%

// ...

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

经过进一步研究,这是因为flex生成的C文件在我的前导代码之前包含<stdio.h> ,而没有先定义_GNU_SOURCE。

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

  • 在flex规则中正确编译,并且
  • 可选 )还可以在非GNU环境中使用?

在重新检查使我养成使用asprintf习惯的那本书 asprintf ,我发现它确实是GNU扩展。

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

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

sudo apt-get install libiberty-dev

然后,我修改了序言,使其包括:

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

一切正常,没有任何警告。

假设一个自由软件包可用于非Linux发行版(并且考虑到它是GCC的一部分,我会认为是这种情况),那么该解决方案应该可以在跨平台(在POSIX-ish OS上)上工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM