在具有16.01版的Code::Block和minwg32 gcc的Windows上。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <windows.h>
#ifdef WIN32
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
#endif
struct timezone_ex
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};
int gettimeofday_ex(struct timeval *tv, struct timezone_ex *tz);
/********************************************//**
* \brief
*
* \param tv struct timeval*
* \param tz struct timezone*
* \return int
*
***********************************************/
int gettimeofday_ex(struct timeval *tv, struct timezone_ex *tz)
{
FILETIME ft;
unsigned long long tmpres = 0;
static int tzflag;
if (tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
/*converting file time to unix epoch*/
tmpres /= 10; /*convert into microseconds*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
if (tz)
{
if (!tzflag)
{
_tzset();
tzflag++;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}
return 0;
}
int main()
{
struct timeval t;
gettimeofday_ex(&t, NULL);
printf("t.tv_sec=%d, t.tz_dsttime=%d;\r\n", t.tv_sec, t.tv_usec);
return 0;
}
当我编译没有标记-std=c99的代码时,它就工作了;
以下是生成日志:
--------------Build:TestForStudy中的调试(编译器:GNU GCC编译器)---------------
mingw32-g c c.exe-g-c D:\工作区\iSource\TestForStudy\main.c-o
obj\Debug\main.o mingw32-g++.exe-o bin\Debug\TestForStudy.exe
obj\Debug\main.o-lpthread输出文件是
bin\Debug\TestForStudy.exe,大小为40.23 KB,进程终止于
状态0(0分钟,0秒)0个错误,0个警告(0
分,0秒)
但是,如果我添加了标志-std=c99,并重新构建它,就会得到错误消息:
--------------Build:TestForStudy中的调试(编译器:GNU GCC编译器)---------------
mingw32-g c c.exe-std=c99-g-c
D:\工作区\iSource\TestForStudy\main.c-o obj\Debug\main.o
mingw32-g++.exe-o bin\Debug\TestForStudy.exe obj\Debug\main.o
-lpthread D:\WorkSpace\iSource\TestForStudy\main.c:在函数“gettimeofday”中:D:\WorkSpace\iSource\TestForStudy\main.c:60:13:
警告:函数'\u tzset'的隐式声明
[-Wimplicit函数声明]
_tzset();
^D:\WorkSpace\iSource\TestForStudy\main.c:63:30:错误:'\u timezone'未声明(首次在此函数中使用)
tz->tz_minuteswest=_时区/60;
^D:\工作区\iSource\TestForStudy\main.c:63:30:注意:每个未声明的
对于每个出现在中的函数,标识符只报告一次
D:\工作区\iSource\TestForStudy\main.c:64:26:错误:'\u日光'
未声明(此函数中的第一次使用)
tz->tz-dsttime=白天;
^进程已终止,状态为1(0分钟,0秒)2个错误,1个警告(0分钟),0
秒)
我在谷歌上搜索了一些关于这个问题的东西,但没有任何有用的东西。我不知道是我的代码有问题还是minwg32有问题?
有人能给我这个问题的提示吗?
谢谢你!
编辑:
在我提出这个问题之后,我读到了这个问题:
Socket undeclared when i use -std=c99 [c]
这似乎是同一个问题,我尝试将-std=c99改为-std=gnu99,它再次工作。
那么,这是带有c99标志的minwg32中的一个bug吗?因为我认为无论使用哪个标志,代码都不会有任何错误,所有标志都不应该有错误。
最佳答案
在命令行中指定特定的C标准版本时,标准头文件的所有非标准内容都将“隐藏”。这就是tzset
的情况。它在<time.h>
中声明,但不是<time.h>
的标准成员。标准库没有这样的功能。
如果希望编译器在<time.h>
中看到并使用它,请指定-std=gnu99
,而不是-std=c99
。如果您希望您的程序符合标准,请使用-std=c99
并忘记tzset
。不是这个就是那个。
关于c - 将标志“-std = c99”添加到minwg32会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44733462/