我想编写一个unicode版本的std :: exception和std :: runtime_error 所以我想更好的方法就是从C ++标准库中获取实现并改变它们以支持unicode。
所以我在Visual C ++中提取了异常和 stdexcept 标题,复制了代码,做了我的修改。
除非我删除了_CRTIMP_PURE
,否则我无法将其链接起来。
我还从所有成员函数中删除了_EXCEPTION_INLINE __CLR_OR_THIS_CALL
前缀。
它起作用,但我很好奇所有这些事情的作用
_EXCEPTION_INLINE
它在字面上定义为#define _EXCEPTION_INLINE
,我的Google搜索技能无法找到有关其内容的任何文档。
那么,有谁知道这些意图是做什么的?在我从班级中删除_CRTIMP_PURE
前缀之前,它为什么会链接?
答案 0 :(得分:2)
这些并不是什么神秘的东西(但追踪它们被定义的位置可能有点痛苦 - 但只是一点点)。它们在作为库的一部分的头中定义,并且它们采用不同的定义,具体取决于为当前运行配置编译器的方式。特别是,这些宏似乎主要关注的是当前运行是否配置为/clr:pure
。
_CRTIMP_PURE
构建),则 __declspec(dllimport)
定义为/clr:pure
,否则定义为无。
如果您的库不是DLL(或者每当配置DLL运行时它不一定是DLL),那么您不应该使用它。您可能不应该使用它,因为在构建库时,您需要以不同的方式定义它(而不是在使用库时)(这是Microsoft在构建C运行时库时所做的工作)。
如果您使用__CLR_OR_THIS_CALL
进行构建,则Microsoft的库使用 __clrcall
来声明具有/clr:pure
的函数(表示这些函数仅由托管代码调用 - 编译器可以执行在这种情况下似乎有某些优化)。
最后,_EXCEPTION_INLINE
用于构建class exception
inline
的成员函数,如果使用/clr:pure
进行构建。
所以最重要的是,不要使用__CLR_OR_THIS_CALL
或_EXCEPTION_INLINE
,除非您计划为您的库支持/clr
,并且您可能不应该使用_CRTIMP_PURE
在你的实现中,但可能应该使用类似你自己制作的东西并在你自己的控制之下。
答案 1 :(得分:1)
标准库实现代码通常使用特定于编译器的扩展来提高性能/文档/可靠性。您不应该在自己的代码中使用这些扩展,因为它们可能会在后续版本的编译器中中断。
复制std::exception
和朋友的界面没有问题,你可以看一下Visual Studio的实现,以获得灵感。但是您的实现应该只使用公开记录的语言/库特性。