c++ - Visual C++ 标准库关键字

标签 c++ windows winapi visual-c++ c++-standard-library

我想编写 std::exception 和 std::runtime_error 的 unicode 版本。
所以我想有什么更好的方法就是从 C++ 标准库中获取实现并更改它们以支持 unicode。

所以我在 Visual C++ 中提取了 exceptionstdexcept header ,复制了代码,进行了更改。

问题是,除非删除 _CRTIMP_PURE,否则我无法链接它。 我还从所有成员函数中删除了 _EXCEPTION_INLINE __CLR_OR_THIS_CALL 前缀。

它在工作,但我很好奇所有这些东西做了什么。
_EXCEPTION_INLINE 它的字面意思就在它的正上方定义为 #define _EXCEPTION_INLINE,我的谷歌搜索技术找不到任何关于它们所做的文档。

那么,有人知道这些是做什么用的吗?为什么在我从类中删除 _CRTIMP_PURE 前缀之前它不会链接?

最佳答案

这些实际上并不是什么神秘的东西(但是追踪它们的定义位置可能会有点痛苦 - 但只是一点点)。它们在作为库一部分的 header 中定义,并且根据编译器为当前运行配置的方式采用不同的定义。特别是,这些宏似乎主要关注当前运行是否为 /clr:pure 配置。

_CRTIMP_PURE 定义为 __declspec(dllimport) 如果您链接到 C 运行时的 DLL 版本(而不是使用 /clr:pure 构建), 并且没有其他定义。

如果您的库不是 DLL(或者如果在配置 DLL 运行时时它不一定是 DLL),那么您不应该使用它。您可能无论如何都不应该使用它,因为在构建您的库时和在使用您的库时您需要以不同的方式定义它(Microsoft 在构建 C 运行时库时就是这样做的)。

__CLR_OR_THIS_CALL 被 Microsoft 的库用来声明一个带有 __clrcall 的函数,如果你使用 /clr:pure 构建(表明这些函数只会被托管代码调用——在这种情况下,编译器似乎可以执行某些优化)。

最后,_EXCEPTION_INLINE 用于class exception 的成员函数 inline if building with /clr:pure.

所以底线是,不要使用 __CLR_OR_THIS_CALL_EXCEPTION_INLINE 除非您计划为您的库支持 /clr,并且您可能不应该在您的实现中使用 _CRTIMP_PURE,但可能应该使用您自己制作并在您自己的控制下的类似东西。

关于c++ - Visual C++ 标准库关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9644092/

相关文章:

c++ - 从 QtCreator 启动 OpenGL 应用程序时出现严重问题

windows - 让 selenium、ghostdriver、phantomJS 在 Windows 7 上工作

c++ - C++ 的 RSA 加密库

c++ -::TransparentBlt 无法正常工作

android - SGS4 安卓 4.4.2 - OGL ES2 崩溃

c++ - 为什么不强制 operator new 将参数作为 "const size_t"?

c++ - 如何在 C++ 中一次性生成不同的随机数?

node.js - 如何在 NodeJS 中检测 "file handle leak"?

带有通过标准输入传递的目标的 CreateProcessW - 找不到目标

c++ - 为什么 sleep 功能会禁用我的互斥体