C++ 为什么gcov在类函数定义中报告为不可执行?

C++ 为什么gcov在类函数定义中报告为不可执行?,c++,g++,code-coverage,gcov,C++,G++,Code Coverage,Gcov,gcov似乎不将类方法的内联定义报告为可执行行。例如: #include <iostream> struct Foo { void bar() {} void baz() {} }; int main() { Foo foo; foo.bar(); } 为什么第5行被报告为不可执行,即使上面的方法被正确地报告为执行过一次 更新 根据gcov文档(),-表示不可执行的行,而####和===标记可以执行但没有执行的行。gcov报告说,在链接二进制文件后,Foo::b

gcov似乎不将类方法的内联定义报告为可执行行。例如:

#include <iostream>

struct Foo {
  void bar() {}
  void baz() {}
};

int main() {
  Foo foo;
  foo.bar();
}
为什么第5行被报告为不可执行,即使上面的方法被正确地报告为执行过一次

更新


根据gcov文档(),
-
表示不可执行的行,而
####
===
标记可以执行但没有执行的行。

gcov报告说,在链接二进制文件后,
Foo::baz()


链接器完全删除了该函数,因此不再有与该行关联的可执行代码。

gcov告诉您执行了
bar()
,而没有执行
baz()
。这是正确的。我误解了你的问题吗?@Drew Dorman我已经更新了问题以处理你的评论。你确定这行是可执行的吗?我想象一个从未被调用过的函数从最终的二进制文件中被省略了!谢谢!您是否知道阻止这种行为的标志,使链接器包含所有功能?我相信它是
--整个归档文件
,发送到链接器。谢谢!然而,链接器似乎不是问题所在。当我只编译(
-c
)时,对象文件中已经缺少了
baz
。你知道我该怎么防止吗?很抱歉没用。我建议发布一个新问题,让更多人关注你的新问题。祝你好运如果函数是
内联的
,如果无法从源文件外部访问该函数,编译器将消除任何“未调用”函数。由于该类是在源文件中定义的,因此无法在外部调用该函数,编译器只是将其删除。这就是我对编译器的期望。您可以通过添加一个调用
baz
函数的函数来解决这个问题,但函数本身从未被调用(但不是
inline
或static)。
        -:    0:Source:main.cpp
        -:    0:Graph:main.gcno
        -:    0:Data:main.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <iostream>
        -:    2:
        -:    3:struct Foo {
        1:    4:  void bar() {}
        -:    5:  void baz() {}
        -:    6:};
        -:    7:
        1:    8:int main() {
        -:    9:  Foo foo;
        1:   10:  foo.bar();
        4:   11:}