爲了確保asprintf
功能是在頭文件<stdio.h>
可見,我按照手冊頁的建議,並把:如何在_GNU_SOURCE未設置時在flex規則中使用asprintf?
#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。
我怎麼能寫一個使用這個功能,
- 正確編譯柔性規則內的代碼,並
- (可選)也能在非GNU環境?
另一個應用程序將調整您的構建系統以傳遞'-D_GNU_SOURCE' – Christoph
但是,如果flex未使用該聲明使用該標頭,則可能會改變其行爲。但是,這也可以起作用,是的。 – tehwalrus
這真的很奇怪。 – fuz