C++ 为什么gcov在类函数定义中报告为不可执行?
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
#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:}