Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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
在c+中激活RTTI+; 谁能告诉我在UNIX上如何激活C++中的RTTI。 我听说它可以被禁用和启用。 在我的unix环境中,如何检查RTTI是启用还是禁用的_C++_Rtti_Hp Ux_Acc - Fatal编程技术网

在c+中激活RTTI+; 谁能告诉我在UNIX上如何激活C++中的RTTI。 我听说它可以被禁用和启用。 在我的unix环境中,如何检查RTTI是启用还是禁用的

在c+中激活RTTI+; 谁能告诉我在UNIX上如何激活C++中的RTTI。 我听说它可以被禁用和启用。 在我的unix环境中,如何检查RTTI是启用还是禁用的,c++,rtti,hp-ux,acc,C++,Rtti,Hp Ux,Acc,我正在HPUX上使用aCC编译器。默认情况下,gcc将其打开。检查typeid(foo).name()是否提供了一些有用的信息 #include <iostream> #include <typeinfo> int main() { std::cout << typeid(int).name() << std::endl; return 0; } 在通过编译器选项编译程序时,RTTI将被启用或禁用-在Unix环境中,它不是全局启用或禁用的。

我正在HPUX上使用
aCC
编译器。

默认情况下,gcc将其打开。检查typeid(foo).name()是否提供了一些有用的信息

#include <iostream>
#include <typeinfo>

int main()
{
 std::cout << typeid(int).name() << std::endl;
 return 0;
}

在通过编译器选项编译程序时,RTTI将被启用或禁用-在Unix环境中,它不是全局启用或禁用的。查看编译器是否在默认情况下启用它的最简单方法是尝试使用RTTI编译一些代码

启用/禁用RTTI的选项将是特定于编译器的-您使用的编译器是什么


默认情况下,GCC中的RTTI支持处于打开状态,选项
-fno RTTI
将关闭支持(如果您使用的是GCC,可能有人在makefile或其他东西中关闭了RTTI)。

您使用的是
g++
还是其他编译器

g++
RTTI中,默认情况下IIRC启用,您可以使用
-fno-RTTI
禁用它。要测试它是否处于活动状态,请使用
dynamic\u cast
typeid

更新
我相信HPUX的
aCC
/
aC++
默认情况下也启用了RTTI,我不知道有什么方法可以禁用它。选中。

启用和禁用RTTI必须是特定于编译器的设置。对于<>代码> DyrimaCase操作,必须启用代码>操作符或C++中的异常,RTTI必须启用。如果您可以编译以下代码,那么您已经启用了RTTI(包括g++在内的大多数编译器都会自动启用RTTI):

#包括
#包括
甲级
{
公众:
虚拟~A(){}
};
B类:公共A
{
};
无效rtti_试验(A&A)
{
尝试
{
B&B=动态演员阵容(a);
} 
捕捉(标准::错误的投射)
{

STD::CUT> P>所有我知道的现代C++编译器(GCC,英特尔,MSVC,SunStudio,ACC)默认都有RTI,所以除非你有任何怀疑它可能被某种原因禁用,否则你可以安全地假设RTTI在ON上。

< P>根据没有选择关闭它。只有两个标准C++可以被禁用。“for循环中的变量范围”(
-Wc,ansi_for_scope,off
)和依赖于参数的名称查找(
-Wc,-koenig_Lookup,off
)。在g++中没有类似于
-Wc,-RTTI,off

的选项。您可以测试代码中是否启用了RTTI。正如其他人所指出的那样,在g++中没有RTTI转换为RTTI。我敢打赌这两个选项在clang中也同样有效

#ifdef __GXX_RTTI
  w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
  if (w != NULL)
  {
    if (w->thing == OK)
      FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
  }
#endif
\ifdef\uuugxx\urtti
w=动态_转换(FooFactory(类型,arg));
如果(w!=NULL)
{
如果(w->thing==OK)
Feastonorangutan和果蝠和早餐谷物();
}
#恩迪夫

在新的C++中,我们将访问<代码>·ypCppyRTTI/COD>以及许多其他的使TEES更容易的东西。编译我的C++程序的编译器。如果II编译为-fNORTRTI会发生什么?编译器会抱怨使用Values吗?只针对那些好奇异常和RTTI之间关系的人。这里讨论的是:总结,异常不需要RTTI启用。因为它没有使用它的特殊特性。动态_cast和typeid。但似乎它仍然使用一些运行时类型信息来匹配异常。

#include <iostream>
#include <typeinfo>

class A
{
public:
  virtual ~A () { }
};

class B : public A
{
};

void rtti_test (A& a)
{
  try
    {
      B& b = dynamic_cast<B&> (a);
    } 
  catch (std::bad_cast)
    {
      std::cout << "Invalid cast.\n";
    }
  std::cout << "rtti is enabled in this compiler.\n";
}

int
main ()
{
  A *a1 = new B;
  rtti_test (*a1);  //valid cast
  A *a2 = new A;
  rtti_test (*a2);  //invalid cast
  return 0;
}
#ifdef __GXX_RTTI
  w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
  if (w != NULL)
  {
    if (w->thing == OK)
      FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
  }
#endif