【发布时间】:2016-01-04 17:19:58
【问题描述】:
为了保证asprintf函数在头文件<stdio.h>中可见,我按照手册页的建议放了:
#define _GNU_SOURCE
#include <stdio.h>
// ... uses of asprintf();
这适用于普通的 C 程序,尽管可能只适用于 GNU/Linux 而不是 BSD。
我希望能够在弹性词法分析器中使用相同的技巧,例如:
%{
#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 环境?
【问题讨论】:
-
另一种方法是调整您的构建系统以通过
-D_GNU_SOURCE -
但是,如果 flex 使用该标头而没有该声明,则有可能会改变其行为。但这也会奏效,是的。
-
这真的很奇怪。
标签: c flex-lexer