2016-01-04 19 views
0

爲了確保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環境?
+0

另一個應用程序將調整您的構建系統以傳遞'-D_GNU_SOURCE' – Christoph

+0

但是,如果flex未使用該聲明使用該標頭,則可能會改變其行爲。但是,這也可以起作用,是的。 – tehwalrus

+0

這真的很奇怪。 – fuz

回答

1

已經重新檢查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包可用於非Linux發行版(以及考慮到它是GCC的一部分,我會以爲這將是這種情況),該解決方案應該工作的跨平臺(在POSIX十歲上下的操作系統的。)

+0

您可能想看看http://stackoverflow.com/a/30687023/1566221。如果您將對asprintf的調用抽象化爲支持庫,則只需包含該庫的頭文件,並且還可以隱藏基礎結構以決定使用哪個版本。 – rici

相關問題