1

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

因此,我在 Visual C++ 中提取了异常stdexcept标头,复制了代码,进行了更改。

问题是除非我删除_CRTIMP_PURE. 我还_EXCEPTION_INLINE __CLR_OR_THIS_CALL从所有成员函数中删除了前缀。

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

那么,有人知道这些是什么意思吗?以及为什么在我_CRTIMP_PURE从班级中删除前缀之前它不会链接?

4

2 回答 2

2

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

_CRTIMP_PURE__declspec(dllimport)如果您要链接到 C 运行时的 DLL 版本(而不是使用 构建/clr:pure),则定义为,否则定义为任何内容。

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

__CLR_OR_THIS_CALL__clrcall如果您正在构建,Microsoft 的库使用它来声明一个函数/clr:pure(表明这些函数只会由托管代码调用 - 在这种情况下编译器似乎可以执行某些优化)。

最后,_EXCEPTION_INLINE用于制作class exception inlineif 构建的成员函数/clr:pure

所以底线是,不要使用__CLR_OR_THIS_CALL或者_EXCEPTION_INLINE除非你打算支持/clr你的库,而且你可能不应该_CRTIMP_PURE在你的实现中使用,但可能应该使用你自己制作并在你自己控制下的类似东西。

于 2012-03-10T05:49:18.797 回答
1

出于性能/文档/可靠性的原因,标准库实现代码通常使用特定于编译器的扩展。您不应在自己的代码中使用这些扩展,因为它们可能会在编译器的后续版本中中断。

复制和朋友的界面是没有问题的std::exception,大家可以看看Visual Studio的实现找灵感。但是您的实现应该只使用公开记录的语言/库功能。

于 2012-03-10T05:49:59.450 回答