未设置 _GNU_SOURCE 时如何在 flex 规则中使用 asprintf?
How to use asprintf in a flex rule, when _GNU_SOURCE not set?
为了确保asprintf
函数在头文件<stdio.h>
中可见,我按照man page的建议放了:
#define _GNU_SOURCE
#include <stdio.h>
// ... uses of asprintf();
这适用于普通的 C 程序,虽然大概只适用于 GNU/Linux 而不是 BSD。
我希望能够在 flex 词法分析器中使用相同的技巧,例如:
%{
#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 环境?
re-checked 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 包可用于 non-Linux 发行版(并且鉴于它是 GCC 的一部分,我认为情况会如此)该解决方案应该跨平台工作(在 POSIX-ish OS 的。)
为了确保asprintf
函数在头文件<stdio.h>
中可见,我按照man page的建议放了:
#define _GNU_SOURCE
#include <stdio.h>
// ... uses of asprintf();
这适用于普通的 C 程序,虽然大概只适用于 GNU/Linux 而不是 BSD。
我希望能够在 flex 词法分析器中使用相同的技巧,例如:
%{
#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 环境?
re-checked 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 包可用于 non-Linux 发行版(并且鉴于它是 GCC 的一部分,我认为情况会如此)该解决方案应该跨平台工作(在 POSIX-ish OS 的。)