2011-11-28 22 views
5

我在Ubuntu 10.04使用GCC,我想用宏TEMP_FAILURE_RETRY如下所述:TEMP_FAILURE_RETRY和__USE_GNU

http://www.gnu.org/s/hello/manual/libc/Interrupted-Primitives.html

然而,當我編譯我得到了以下錯誤:

undefined reference to `TEMP_FAILURE_RETRY' 

我看着在unistd.h中,其中宏被定義,它是由前面:

#ifdef __USE_GNU 

如何讓我的代碼編譯和使用這個宏?我可以簡單地在我的代碼中使用相同的#ifdef __USE_GNU來包裝它嗎?

回答

6

__USE_GNU是一個內部宏,所以你不應該自己定義它。

但是,您可以在代碼中或編譯時(使用-D選項)定義_GNU_SOURCE

我認爲定義這一個將有助於使TEMP_FAILURE_RETRY可用。

+0

好的,所以我只需要將_GNU_SOURCE定義爲一個值?但是,這將使它依賴於GNU,有沒有什麼辦法讓我的代碼使用宏,如果它在編譯時可用,但如果沒有它,編譯沒有它? – SlappyTheFish

+0

如果使用Ubuntu,我想你可以確定GNU將被使用,所以你可以安全地定義它...... – Macmade

+0

好吧,但理想情況下,我希望代碼是可移植的,至少適用於所有類型的Linux。 – SlappyTheFish

0

使用_GNU_SOURCE可能會影響代碼的可移植性,除了TEMP_FAILURE_RETRY之外,它還會帶來很多其他內容。如果你只需要TEMP_FAILURE_RETRY的功能,你不妨自己定義類似的宏,這裏不使用任何GNU擴展標準C版:

#define CALL_RETRY(retvar, expression) do { \ 
    retvar = (expression); \ 
} while (retvar == -1 && errno == EINTR); 

其中retvar你傳遞一個變量,其中的名你想要存儲返回值。