要使gcc
包含gmtime_r(3)
中的time.h
声明,我需要做什么?看着/usr/include/time.h
,gmtime_r
和localtime_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 */
答案 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