GCC C++ 为单个 class 覆盖 -frtti
GCC C++ override -frtti for single class
有没有办法避免在使用 -frtti
编译时为整个翻译单元或某些 class 生成类型信息?
也许有魔法 #pragma
或 __attribute__
可以覆盖命令行选项?
提前致谢。
对我来说,似乎没有可能的魔法。而且,在我看来,任何一种这样的魔法都会造成破坏。
唯一允许用户从代码内部微调编译选项的神奇 GCC pragma 是 pragma GCC optimize
。
此 pragma 在功能方面起作用,因为优化器本身在功能方面起作用,您可以很容易地看到,它对类型的 RTTI 生成没有影响:
#include <iostream>
#include <typeinfo>
struct X
{
virtual int foo() {return 0;}
};
#pragma GCC optimize ("no-rtti")
struct Y
{
virtual int foo() {return 0;}
};
#pragma GCC reset_options
int
main ()
{
std::cout << "X: " << sizeof (X) << " " << typeid(X).name() << std::endl;
// next line should *NOT* build/link if the pragma was taken into account
std::cout << "Y: " << sizeof (Y) << " " << typeid(Y).name() << std::endl;
return 0;
}
在 GCC 5.2 中,输出为:
X: 8 1X
Y: 8 1Y
有没有办法避免在使用 -frtti
编译时为整个翻译单元或某些 class 生成类型信息?
也许有魔法 #pragma
或 __attribute__
可以覆盖命令行选项?
提前致谢。
对我来说,似乎没有可能的魔法。而且,在我看来,任何一种这样的魔法都会造成破坏。
唯一允许用户从代码内部微调编译选项的神奇 GCC pragma 是 pragma GCC optimize
。
此 pragma 在功能方面起作用,因为优化器本身在功能方面起作用,您可以很容易地看到,它对类型的 RTTI 生成没有影响:
#include <iostream>
#include <typeinfo>
struct X
{
virtual int foo() {return 0;}
};
#pragma GCC optimize ("no-rtti")
struct Y
{
virtual int foo() {return 0;}
};
#pragma GCC reset_options
int
main ()
{
std::cout << "X: " << sizeof (X) << " " << typeid(X).name() << std::endl;
// next line should *NOT* build/link if the pragma was taken into account
std::cout << "Y: " << sizeof (Y) << " " << typeid(Y).name() << std::endl;
return 0;
}
在 GCC 5.2 中,输出为:
X: 8 1X
Y: 8 1Y