【发布时间】:2017-11-27 17:51:04
【问题描述】:
在带有 Code::Block 版本 16.01 和 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 的代码时,它可以工作; 这是构建日志:
------------- 构建:TestForStudy 中的调试(编译器:GNU GCC 编译器)---------------
mingw32-gcc.exe -g -c D:\WorkSpace\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,并再次重建它,我会收到错误消息:
------------- 构建:TestForStudy 中的调试(编译器:GNU GCC 编译器)---------------
mingw32-gcc.exe -std=c99 -g -c D:\WorkSpace\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_ex”中:D:\WorkSpace\iSource\TestForStudy\main.c:60:13: 警告:函数“_tzset”的隐式声明 [-Wimplicit-function-declaration] _tzset(); ^ D:\WorkSpace\iSource\TestForStudy\main.c:63:30: error: '_timezone' undeclared (第一次在这个函数中使用) tz->tz_minuteswest = _timezone / 60; ^ D:\WorkSpace\iSource\TestForStudy\main.c:63:30:注意:每个未声明 标识符对于它出现的每个函数只报告一次 D:\WorkSpace\iSource\TestForStudy\main.c:64:26:错误:'_daylight' 未声明(在此函数中首次使用) tz->tz_dsttime = _daylight; ^ 进程以状态 1 终止(0 分钟,0 秒)2 错误,1 警告(0 分钟,0 秒)
我已经用谷歌搜索了一些关于这个问题的东西,但我没有得到任何有用的信息。而且我不知道是我的代码有问题还是 minwg32 的错误?
任何人都可以给我任何关于这个问题的提示吗? 谢谢!
编辑:
发布此问题后,我阅读了此问题: Socket undeclared when i use -std=c99 [c]
好像是同样的问题,我试着把-std=c99改成-std=gnu99,又可以了。
那么,这是 minwg32 中带有标志 c99 的错误吗?因为我觉得不管用哪个flag,代码都没有错误,所有的flag都不应该有错误。
【问题讨论】: