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

标签 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如果未使用的方法在最终可执行文件中被省略,则将它们报告为不可执行。但是,为了获得有意义的报告,我希望将它们报告为可执行但未执行。为此,我需要找到一种无需更改原始源代码即可实现的方法。

最佳答案

一种可移植的方法是向这些例程添加一些“引用”(在通常意义上,不仅仅是 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/

相关文章:

css - 获取整个网页的 'calculated' CSS

c:带有函数实现的内联枚举

html - 如何在不破坏标记的情况下使用包装器包装任意 HTML?

c++ - Open MP:SIMD循环中的SIMD兼容功能?

c++ - 宏未在此范围内声明

linux - 如何解决共享库中 undefined reference ?

html - 无法让 Div 并排呈现

c++ - 链接期间未定义的函数引用

transactions - 为什么这个自定义程序被命名为AQZZ...?

go - 使用go for openapi生成器时如何指定模块路径?