函数“ gmtime_r”的隐式声明

时间:2019-05-28 21:57:51

标签: c gcc posix time.h

要使gcc包含gmtime_r(3)中的time.h声明,我需要做什么?看着/usr/include/time.hgmtime_rlocaltime_r#ifdef __USE_POSIX内部。

我是否需要做一些事情来打开__USE_POSIX,例如命令行选项?我现在正在使用-std=c99。我了解__USE_*宏不是要由用户代码直接设置的。

/* Return the `struct tm' representation of *TIMER
   in Universal Coordinated Time (aka Greenwich Mean Time).  */
extern struct tm *gmtime (const time_t *__timer) __THROW;

/* Return the `struct tm' representation
   of *TIMER in the local timezone.  */
extern struct tm *localtime (const time_t *__timer) __THROW;

#ifdef __USE_POSIX
/* Return the `struct tm' representation of *TIMER in UTC,
   using *TP to store the result.  */
extern struct tm *gmtime_r (const time_t *__restrict __timer,
                struct tm *__restrict __tp) __THROW;

/* Return the `struct tm' representation of *TIMER in local time,
   using *TP to store the result.  */
extern struct tm *localtime_r (const time_t *__restrict __timer,
                   struct tm *__restrict __tp) __THROW;
#endif  /* POSIX */

2 个答案:

答案 0 :(得分:5)

执行此操作的正确方法是:

#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
#include <time.h>

int main ()
{
    time_t t;
    struct tm res;
    char buf[26];

    t = time (NULL);
    gmtime_r (&t, &res);
    asctime_r (&res, buf);
    printf ("%s", buf);

    return 0;
}

此方法明确指示源文件所需的功能,使其独立。它也可以使用任何编译器移植到任何POSIX系统。不需要特殊的编译器标志。

对于GCC,此代码将使用-std = c89,-std = c99或任何其他值进行编译。重要的是-std = gnu吗?默认情况下启用会因版本或平台而异。

有关详细信息,请参见Feature Test Macros

答案 1 :(得分:1)

实际上,gmtime_r不是ISO C99标准的一部分,它是POSIX扩展名。为此,请使用std=gnu99标准。

您始终可以通过应用this Pixelbeat article中的技术来验证系统上哪些功能适用于哪种标准:

  

有时确切地知道可能会造成混乱   您的程序中#defined是什么,尤其是   对于glibc的“功能”宏为true。这些宏已记录在案   (info libc“功能测试宏”),但要容易得多   来查看使用“ cpp -dD”直接定义的内容,例如:

$ echo "#include <features.h>" | cpp -dN | grep "#define __USE_"
    #define __USE_ANSI
    #define __USE_POSIX
    #define __USE_POSIX2
    #define __USE_POSIX199309
    #define __USE_POSIX199506
    #define __USE_MISC
    #define __USE_BSD
    #define __USE_SVID

$ echo "#include <features.h>" | cpp -dN -std=c99 | grep "#define __USE_"
    #define __USE_ANSI
    #define __USE_ISOC99
     

还要查看一个人可以做的所有预定义宏:

$ cpp -dM /dev/null
     

请注意,对于特定于编译器的宏,您可以这样做:

$ gcc -E -dM - < /dev/null