我现在正在进行C代码覆盖率研究并遇到以下问题,GCC版本4.4.6:
CFLAGS = --coverage和链接器选项LDFLAGS := --coverage或LOCAL_LDLIBS := --coverage得到错误:undefined reference to '__gcov_init'" and "undefined reference to '__gcov_merge_add'
LOCAL_LDFLAGS := --coverage,并收到链接错误:libgcov.a(_gcov.o): in function __gcov_set_sampling_rate: undefined reference to '__gcov_sampling_rate'
libgcov.a(_gcov.o): in function gcov_exit: undefined reference to '__gcov_pmu_profile_filename'
libgcov.a(_gcov.o): in function __gcov_init: undefined reference to '__gcov_pmu_profile_options' '__gcov_pmu_top_n_address'
有人可以帮忙就这个问题提供一些建议吗?
当try块遇到异常时,将取消堆栈堆栈。如果在try块内部创建了对象,则调用析构函数。如果析构函数引发另一个异常,则不会捕获此异常,并且程序将终止。
因此,如果您有:
struct A {
~A () noexcept(false) {
std::cout << "A::~A" << std::endl;
throw std::runtime_error("A::~A ERROR");
}
};
Run Code Online (Sandbox Code Playgroud)
然后您的try-catch块类似于:
try {
A a1;
A a2;
} catch (...) {}
Run Code Online (Sandbox Code Playgroud)
然后,当try块完成时,a2抛出异常的析构函数,捕获异常,然后抛出异常的析构函数a1并终止程序。一切正常。
但是,如果您引入另一个结构,该结构也抛出了析构函数,但从成员继承A或具有A成员实例,事情就会变得混乱。例如,如果您有:
struct B : A {
~B () noexcept(false) {
std::cout << "B::~B" << std::endl;
throw std::runtime_error("B::~B ERROR");
}
};
Run Code Online (Sandbox Code Playgroud)
然后,如果您这样做:
try {
B b;
A a;
} catch (...) {}
Run Code Online (Sandbox Code Playgroud)
预期的结果应该A::~A是称为异常捕获,然后B::~B称为程序终止。但是,相反,在我尝试过的所有编译器中,除MSVC之外,输出为:
A::~A
B::~B
A::~A
Run Code Online (Sandbox Code Playgroud)
抛出的实例后终止调用 std::runtime_error …