强制g ++为未使用的函数生成代码

时间:2014-06-20 07:30:52

标签: g++ code-generation inline

默认情况下,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会将未使用的方法报告为不可执行的,如果它们从最终的可执行文件中省略的话。但是,要获得有意义的报告,我希望将它们报告为可执行但未执行。为此,我需要找到一种方法来实现这一点,而无需更改原始源代码。

1 个答案:

答案 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)来自动添加这样的数组(不需要触及源代码),但这需要一些工作。