在具有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/

10-08 22:45