Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
启用和禁用RTTI的模块之间的兼容性 看起来我以前的问题有点不对,但至少,从下面的答案来看,现在我知道C++运行库LIB是用RTTI(/MSC)中的启用的Gr++编译的,也许我可以问一个更好的问题。考虑下面的代码: #include <exception> #include <vector> int main() { try { std::vector<int> v; int a = v.at(15); } catch (const std::exception & e) { e.what(); } return 0; }_C++_C++17 - Fatal编程技术网

启用和禁用RTTI的模块之间的兼容性 看起来我以前的问题有点不对,但至少,从下面的答案来看,现在我知道C++运行库LIB是用RTTI(/MSC)中的启用的Gr++编译的,也许我可以问一个更好的问题。考虑下面的代码: #include <exception> #include <vector> int main() { try { std::vector<int> v; int a = v.at(15); } catch (const std::exception & e) { e.what(); } return 0; }

启用和禁用RTTI的模块之间的兼容性 看起来我以前的问题有点不对,但至少,从下面的答案来看,现在我知道C++运行库LIB是用RTTI(/MSC)中的启用的Gr++编译的,也许我可以问一个更好的问题。考虑下面的代码: #include <exception> #include <vector> int main() { try { std::vector<int> v; int a = v.at(15); } catch (const std::exception & e) { e.what(); } return 0; },c++,c++17,C++,C++17,编译器为std::exeption(我捕获的)生成虚拟方法表(VMT),而不包含RTTI信息,因为所有std::exception虚拟方法(析构函数和其他)都是在头文件C:\Program Files(x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\vcruntime\u exception.h < > >代码> STD::向量抛出 STD::OXION范围>代码>,其中VMT包含R

编译器为std::exeption(我捕获的)生成虚拟方法表(VMT),而不包含RTTI信息,因为所有std::exception虚拟方法(析构函数和其他)都是在头文件
C:\Program Files(x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include\vcruntime\u exception.h

< > >代码> STD::向量抛出<代码> STD::OXION范围>代码>,其中VMT包含RTTI信息,因为C++运行时LIBS是用RTTI编译的。 因此,在VMT中使用RTTI抛出异常,但在VMT中使用RTTI捕获异常。什么机制使这成为可能(使这两个VMT兼容)

EDIT1:


还有另一个例子,我将多态类型从module1传递到module2(通过值或引用),并使用启用的RTTI编译module1,使用禁用的RTTI编译module2。所以std::exception本身是不相关的,我只是把它作为一个例子使用。

即使RTTI被禁用,如果异常处理需要运行时信息,编译器也会生成它

目前尚未找到与VisualStudio相关的文档

-fno rtti

禁止生成具有虚拟函数的每个类的信息,供C++运行时类型识别特性(DyrimoSkyCase/Type ID)使用。如果不使用语言的这些部分,可以使用此标志节省一些空间请注意,异常处理使用相同的信息,但G++会根据需要生成该信息。对于不需要运行时类型信息的强制转换,仍然可以使用dynamic_cast运算符,例如,对void*或明确基类的强制转换


混合使用-frti编译的代码和使用-fno-rtti编译的代码可能无法工作。例如,如果使用-fno-rtti编译的类用作使用-frtti编译的类的基,则程序可能无法链接。

什么是“VMT”意思?@nicolabolas Virtual method table。典型的术语是“vtable”。而且,这(几乎)与RTTI无关。RTTI是关于
dynamic_cast
typeid
;没有这两样东西,你仍然可以使用
virtual
函数。@AlexeyStarinsky:“IMHO:VC使用vtable指针访问RTTI。”这就是我说“几乎”的原因。无论是否使用RTTI编译,都会发生vtable指针。RTTI标志可能更改的是vtable的某些内容。简单地说,RTTI需要一个vtable来处理虚拟类型,但虚拟类型不需要RTTI。为什么您会认为vtable不兼容?您对vtables的内部工作原理有哪些了解,这些知识表明应该出现不兼容?(还有,你怎么知道让你的程序工作的不仅仅是运气?)
cl /std:c++17 /EHsc /GR- example.cpp