Visual C ++标准库关键字

时间:2012-03-10 05:09:26

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

我想编写一个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前缀之前,它为什么会链接?

2 个答案:

答案 0 :(得分:2)

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

如果您链接到C运行时的DLL版本(而不是使用_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的实现,以获得灵感。但是您的实现应该只使用公开记录的语言/库特性。