TEMP_FAILURE_RETRY和__USE_GNU

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

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将其包装起来吗?

__USE_GNU是一个内部宏,因此您不应自己定义它。

但是您可以在代码中或编译时使用_GNU_SOURCE (使用-D选项)。

我认为定义这个将有助于使TEMP_FAILURE_RETRY可用。

使用_GNU_SOURCE可能会对代码的可移植性产生影响,除了TEMP_FAILURE_RETRY之外TEMP_FAILURE_RETRY很多其他东西。 如果你只需要TEMP_FAILURE_RETRY的function,你也可以自己定义类似的宏,这里是一个不使用任何GNU扩展的标准C版本:

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

retvar您传递要存储返回值的变量的名称。