默认情况下,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
会将未使用的方法报告为不可执行的,如果它们从最终的可执行文件中省略的话。但是,要获得有意义的报告,我希望将它们报告为可执行但未执行。为此,我需要找到一种方法来实现这一点,而无需更改原始源代码。
答案 0 :(得分:0)
便携式方法是添加一些"参考" (在通常意义上,不仅是这个词的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)来自动添加这样的数组(不需要触及源代码),但这需要一些工作。