在 jemalloc.h 之前包含 std::mutex 时编译错误

Compile errors when including std::mutex before jemalloc.h

这个

//CSocket.h
#ifndef __SERVER_CSOCKET_H__
#define __SERVER_CSOCKET_H__

#include "winsock2.h"
#include "ws2tcpip.h"

#include <thread>
#include <stdio.h>
#include <string>

(cpp 仅包含 header)

//CSocket.cpp
#include "CSocket.h"

在 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ratio

中产生以下错误消息
ratio(122): error C2065: 'INTMAX_MAX': undeclared identifier
ratio(133): See reference to the instance of the just compiled class-template "std::ratio<_Nx,_Dx>".
ratio(124): error C2065: 'INTMAX_MAX': undeclared identifier
ratio(44): error C2065: 'INTMAX_MAX': undeclared identifier
ratio(217): See reference to the instance of the just compiled class-template "std::_Safe_mult<0x01,0x01>".
ratio(36): error C2338: integer arithmetic overflow
ratio(44): See reference to the instance of the just compiled class-template "std::_Safe_multX<0x01,0x01,false>".
ratio(44): error C2039: 'value': Is not an element of 'std::_Safe_multX<0x01,0x01,false>'
ratio(44): error C2065: 'value': undeclared identifier
ratio(44): error C2057: Expected constant expression
ratio(44): error C2039: 'value': Is not an element of 'std::_Safe_multX<0x01,0x0989680,false>'
ratio(219): error C2975: "_Nx": invalid template argument for "std::ratio", expected compile-time constant expression.
ratio(116): See declaration of '_Nx'
ratio(219): error C2975: "_Dx": invalid template argument for "std::ratio", expected compile-time constant expression.
ratio(117): See declaration of '_Dx'
CSocket.cpp

在 .cpp 而不是 header 中包含 std::thread 可以解决所有错误,但我不知道为什么它在 header 中不起作用。

//CSocket.cpp
#include "CSocket.h"
#include <thread>

我使用的唯一库是 jemalloc。 错误可能来自在互斥锁之前包含 jemalloc.h 而不是来自线程本身?

我必须在 #include "jemalloc.h" 之前 #include <mutex> 而不是之后。 现在工作正常,但出现奇怪的错误。

我遇到了同样的错误,但是包含的顺序对我没有用。我认为这与其他也使用 chrono 和 thread 的 includes 有关,所以你可以检查一下。

您在使用 Visual Studio 吗?似乎有更多人遇到同样的错误:https://connect.microsoft.com/VisualStudio/feedback/details/800726/compiler-error

我和VS2013 update 3有同样的错误。问题似乎是INTMAX_MAX没有定义,但是在ratio.h中使用了。

我的解决方案是添加

#define INTMAX_MAX   INT64_MAX

在你的文件中 #include <ratio> 之前(如果你没有该行,你可以添加它)。

可以在 stdint.h 中找到要包含的行 - 在您的情况下,右侧可以不同。

PS另一种解决方案是#include <stdint.h>并定义__STDC_LIMIT_MACROS。在这种情况下,您可能会收到一些关于重复宏的警告。

当我将 CxImage 用作第三方库并在 C++11 中使用线程池时,项目会发生这种情况。单独它们都可以,而在同一个项目中合并时,就会出现错误。

solution 是将 _STDC_LIMIT_MACROS 的预编译选项添加到 属性 页面 -> 配置属性 -> C/C++ -> 预处理器 -> 项目的预处理器定义。

PS:我的环境是:MFC/VS2015 && windows7 64bit

可能对某人有帮助:)