无法使用与时间和时钟相关的函数 C++ 进行编译

Can't compile with time- and clock-related functions C++

我开始 my first GNU project based on another GNU project 改进它并更改实现。

我尝试实现自己的构建方法,但与时间和时钟相关的函数破坏了我的构建。

我在 Stack Overflow 上看了很多问题,但我对 chronoctimetime.h.

这三个库很困惑

这是构建错误:

/src/gamed/Logger.cpp

#include "Logger.h"
#include <errno.h>
#include <string.h>

#include <stdarg.h>

#include <time.h>

const std::string Logger::CurrentDateTime()
{
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);

    return buf;
}

错误:找不到时间、本地时间和 strftime 标识符

/src/gamed/Packets.h

#ifndef _PACKETS_H
#define _PACKETS_H

#include <time.h>
#include <cmath>
#include <set>

{...}

class GamePacket : public BasePacket {

public:
   GamePacket(uint8 cmd = 0, uint32 netId = 0) : BasePacket(cmd, netId) {
      buffer << (uint32)clock();
   }

};

Error: clock identifier not found

/src/gamed/Pathfinder.cpp

#include "Logger.h"
#include "Pathfinder.h"
#include "Map.h"
#include "AIMesh.h"
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <chrono>
#include "Logger.h"
#include "Minion.h"
#include "Champion.h"

Map * Pathfinder::chart = 0;
auto g_Clock = std::clock();

Error: clock isn't member of std

我做错了什么?

在 C++ 中,您应该在所有 C 库 #include 上使用 "c" 前缀。

所以#include <time.h>应该变成:#include <ctime>.

但请注意,当您使用 #include <ctime> 时,time.h 中的所有内容现在都将位于 std 命名空间中。

所以clock()必须变成std::clock()

有关详细信息,请参阅:http://www.parashift.com/c++-faq/include-c-hdrs-system.html

I very confused with the three libraries chrono, ctime and time.h.

那句话里只有2个图书馆。 <chrono> 是 c++ 标准库的一部分,在 c++11 版本的标准中引入。 None 的代码似乎使用了 <chrono> 中的任何内容。 <time.h> 是 c 标准库的一部分。 <ctime> 是 c++ 标准库中的 header,它将 <time.h> 包装在 std 命名空间内,而不是全局命名空间,后者是 c.[=28= 中唯一的 "namespace" ]

#include <time.h>
// ....
auto g_Clock = std::clock();

Error: clock isn't member of std

您包含了 c header 但尝试引用 std 命名空间。那是不正确的。改为包含 <ctime>,这样 clock 就会在 std.

#include <time.h>
// ...
time_t     now = time(0);

Error: time (...) identifier not found

乍一看,您的代码似乎是正确的。仔细检查这实际上是您正在编译并从中获取错误的代码。这是该函数的简化版本,可以很好地编译 http://coliru.stacked-crooked.com/a/664f568053103f32

从风格上讲,我不建议混合使用 <cXXX><XXX.h> header。选一个。

已解决!

问题是项目使用 enet 库,并且有 time.h,将文件重命名为 enet_time.h 构建工作很好(这是临时修复,我认为使用命名空间更好)。

感谢大家,很抱歉给您带来不便,感谢大家的回复,我学到了更多关于将 C 库包装到 C++ 中的知识。

一声问候