我想编写 std::exception 和 std::runtime_error 的 unicode 版本。
所以我想有什么更好的方法就是从 C++ 标准库中获取实现并更改它们以支持 unicode。
所以我在 Visual C++ 中提取了 exception 和 stdexcept 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/