我是C ++的新手,我正在调试一个allocate.h
文件包含的main.cpp
文件的问题。现在allocate.h
文件的第一行是这样的:#include <memory.h>
。当我尝试编译main.cpp
时,我收到一条错误消息
Microsoft Visual Studio 11.0\ VC\ include\ typeinfo (153) : error
C2504 exception base class undefined
但是当我将第一行更改为:#include <memory>
时,main.cpp编译正常。多数民众赞成在我开始在网上搜索包含文件的这两种风格之间的差异时,我还没有找到任何详细的解释。如果有人能够解释包含.h文件和内存标准头之间的区别,那将非常有用。
是因为#include<memory>
更安全吗?或者是因为它只是在c ++中包含文件的方式。
此外,我正在使用cmake将我的项目包含在llvm生成的解决方案中。生成我的.vcxproj
文件时,其中包含_HAS_EXCEPTIONS=0;
标记中的<PreprocessorDefinitions>
。如果我使用之前的声明#include<memory.h>
并从_HAS_EXCEPTIONS=0;
标记中删除<PreprocessorDefinitions>
,则项目编译正常。这一切是如何联系的?有人可以帮我连接点吗?
答案 0 :(得分:4)
<memory.h>
和<memory>
不是不同的样式,它们是两个完全不同的标题。
<memory.h>
看起来像是MS C库使用的内部标头,您不应该包含它,使用标准C ++标头<memory>
。< / p>
答案 1 :(得分:0)
写完这个答案后,我发现this SO question我认为是相关的。
这与线程安全AFAIK无关。标准C ++标题如下所示,参考文献17.6.1.2标题:
表13 - C ++库头文件
<algorithm> <fstream> <list> <regex> <typeindex>
<array> <functional> <locale> <set> <typeinfo>
<atomic> <future> <map> <sstream> <type_traits>
<bitset> <initializer_list> <memory> <stack> <unordered_map>
<chrono> <iomanip> <mutex> <stdexcept> <unordered_set>
<codecvt> <ios> <new> <streambuf> <utility>
<complex> <iosfwd> <numeric> <string> <valarray>
<condition_variable> <iostream> <ostream> <strstream> <vector>
<deque> <istream> <queue> <system_error>
<exception> <iterator> <random> <thread>
<forward_list> <limits> <ratio> <tuple>
正如其他人所说,memory.h不是其中之一。
为了完整起见,这里是C库设施的C ++标准头文件。
表14 - C库设施的C ++标头
<cassert> <cfloat> <cmath> <cstddef> <ctgmath>
<ccomplex> <cinttypes> <csetjmp> <cstdint> <ctime>
<cctype> <ciso646> <csignal> <cstdio> <cuchar>
<cerrno> <climits> <cstdarg> <cstdlib> <cwchar>
<cfenv> <clocale> <cstdbool> <cstring> <cwctype>