C++ visualc&x2B+;标准库关键字

C++ visualc&x2B+;标准库关键字,c++,windows,winapi,visual-c++,c++-standard-library,C++,Windows,Winapi,Visual C++,C++ Standard Library,我想编写std::exception和std::runtime_error的unicode版本。 所以我想,从C++标准库中实现实现并修改它们来支持Unicode。 所以我在VisualC++中拔出了异常和STECDECPEP头,复制了代码,做了我的修改。 问题是,除非我删除了\u CRTIMP\u PURE,否则我无法将其链接。 我还从所有成员函数中删除了\u EXCEPTION\u INLINE\u CLR\u或\u THIS\u CALL前缀 它起作用了,但我很好奇这些东西都做了些什么。

我想编写std::exception和std::runtime_error的unicode版本。
所以我想,从C++标准库中实现实现并修改它们来支持Unicode。

所以我在VisualC++中拔出了异常和STECDECPEP头,复制了代码,做了我的修改。 问题是,除非我删除了

\u CRTIMP\u PURE
,否则我无法将其链接。 我还从所有成员函数中删除了
\u EXCEPTION\u INLINE\u CLR\u或\u THIS\u CALL
前缀

它起作用了,但我很好奇这些东西都做了些什么。
\u EXCEPTION\u INLINE
它的字面意思是在它的正上方定义为
\define\u EXCEPTION\u INLINE
,而我的谷歌搜索技能找不到任何关于它们做什么的文档


那么,有人知道这些是什么意思吗?为什么在我从类中删除
\u CRTIMP\u PURE
前缀之前它不会链接呢?

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

\u CRTIMP\u PURE
定义为
\u declspec(dllimport)
,如果您是针对C运行时的DLL版本进行链接(而不是使用
/clr:PURE
进行构建),否则定义为nothing

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

如果使用
/CLR:pure
构建,则Microsoft的库使用
\uuuu CLR\u或\u此\u调用
来声明具有
\uuu CLR调用
的函数(表明这些函数将仅由托管代码调用-在这种情况下,编译器似乎可以执行某些优化)

最后,如果使用
/clr:pure
构建,则使用
\u EXCEPTION\u INLINE
使
类EXCEPTION的成员函数内联


因此,底线是,除非您计划为您的库支持
/CLR
,否则不要使用
\u CLR\u或\u THIS\u调用
\u EXCEPTION\u INLINE
,并且您可能不应该在实现中使用
\u CRTIMP\u PURE
,但可能应该使用类似于您自己制作并由您自己控制的东西。

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


复制
std::exception
和friends的接口没有问题,您可以查看VisualStudio的实现以获得灵感。但是您的实现应该只使用公开记录的语言/库功能。

当您说“unicode”时,我认为您实际的意思是“UTF-16”,因为
char*
std::string
非常适合UTF-8,它也是unicode,并且优于UTF-16。在复制和修改它们之后,您是否至少重命名了
std::exception
std::runtime\u error
?让一个被黑客攻击的库类与编译器提供的类共存似乎是一场灾难。@BenjaminLindley:Unicode在Windows中一直被编码为UTF-16,所以我认为Unicode和UTF-16在Microsoft land中可以互换使用。@EmileCormier:我知道对某些人来说,它们是可以互换的,但那些人错了,需要纠正。不,在Windows上,Unicode并不总是以UTF-16编码。这取决于您所使用的库。@BenjaminLindley:我指的是Windows API,但您关于Unicode/UTF16不可替换的观点仍然有效。:-)