[英]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。
我如何编写使用此功能的代码
在重新检查了使我养成使用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.