默认情况下,g++ 似乎会省略未使用的类内定义方法的代码。示例 from my previous question :
struct Foo {
void bar() {}
void baz() {}
};
int main() {
Foo foo;
foo.bar();
}
使用 g++ -g -O0 - c main.cpp
编译时,生成的目标文件仅包含对 bar
的引用而不是 baz
.添加--no-deafault-inline
对计算机标志也无济于事。关于如何强制 g++ 为 baz
生成代码的任何想法还有吗?
理由
测试覆盖率工具 gcov
如果未使用的方法在最终可执行文件中被省略,则将它们报告为不可执行。但是,为了获得有意义的报告,我希望将它们报告为可执行但未执行。为此,我需要找到一种无需更改原始源代码即可实现的方法。
最佳答案
一种可移植的方法是向这些例程添加一些“引用”(在通常意义上,不仅仅是 C++ 中的引用)。
这可以像
这样简单 typedef void (Foo::*funptr_t) (void);
extern "C" const funptr_t tabfun[] = { &Foo::bar, &Foo::baz };
(我将数组 tabfun
声明为 extern "C"
以确保发出数组,即使未使用也是如此)
您可以尝试 GCC 的 -fno-inline
参数。您还可以自定义 GCC(例如使用 MELT )以自动添加这样的数组(无需触及源代码),但这需要一些工作。
关于g++ - 强制 g++ 为未使用的函数生成代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24322139/