小编Jen*_*ens的帖子

使用gcov忽略或排除外部库中的代码

我正在一个使用几个Boost库的项目中。查看测试报告时,我们发现测试覆盖率信息有时确实适合我们的源代码。我能够将其追踪到boost :: range。我认为这是由于库中进行了一些静态初始化,尽管我无法说得更具体些。

基本上,如果您使用编译以下代码gcc --coverage,请运行,然后使用进行打印覆盖率报告gcov -b,那么将有四个其他分支和另一行,我想忽略它们。

#include <boost/range.hpp>

int foo(int x)
{
    return x+1;
}

int main(int argc, char* argv[])
{
    return foo(argc);
}
Run Code Online (Sandbox Code Playgroud)

覆盖率报告为:已执行的行:已执行5条分支的100.00%:已执行4条的100.00%至少被执行一次:已执行4条呼叫的50.00%已执行2条呼叫:已创建2条的100.00%创建'test_gcov.cpp.gcov'

我猜这5行的计数来自两个函数签名,函数主体和boost :: range库中的另一行。我不知道确切在哪里,但是生成的gcov文件显示正在进行一些静态初始化,所以我猜那是分支所在的位置。

我想知道是否有一种方法可以告诉gcov忽略boost名称空间中的任何代码,或任何其他方式。

c++ gcov boost-range

5
推荐指数
1
解决办法
800
查看次数

对具有接口类和类型变量的 Java 交叉类型的限制

今天,我尝试编写一个具有使用交集类型的泛型方法的类,并被根据相交类型的不同错误消息弄糊涂了。假设我们有 aninterface和 aclass并在泛型接口中定义泛型方法:

class ClassType {
}

interface InterfaceType {
}

interface I<T> {
    public <X extends InterfaceType & InterfaceType> void foo();

    public <X extends ClassType & ClassType> void foo1();

    public <X extends ClassType & InterfaceType> void foo2();

    public <X extends InterfaceType & ClassType> void foo3();

    public <X extends T & ClassType> void foo4();

    public <X extends ClassType & T> void foo5();

    public <X extends InterfaceType & T> void foo6();

    public <X extends T & InterfaceType> …
Run Code Online (Sandbox Code Playgroud)

java types jls

5
推荐指数
1
解决办法
1655
查看次数

通过交集类型具有附加约束的通用参数

我正在编写一个表示时间序列数据的类,即基本上(Instant, T)是泛型类型的对映射T

interface TimeSeries<T> {
     void add(Instant when, T data);
}
Run Code Online (Sandbox Code Playgroud)

我们处理的一些类实现了一个接口

interface TimeStamped {
    Instant getTimeStamp();
}
Run Code Online (Sandbox Code Playgroud)

我想在TimeSeries界面中提供一个更方便的方法来添加这些数据项而不说明时间明确.基本上,我想要

interface TimeSeries<T> {
     void add(Instant when, T data);
     default <X extends T & TimeStamped> void add(X data) {
         add(data.getTimeStamp(), data);   
     } 
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不被语言所允许,因为我不能在交集类型中使用类型变量.是否存在不涉及放弃静态类型安全的解决方法?我能想到的唯一的事情是

interface TimeSeries<T> {
     void add(Instant when, T data);
     default void add(TimeStamped data) {
         add(data.getTimeStamp(), (T)data);   
     }
     default void add(TimeStamped t, T data) {
         add(t.getTimeStamp(), data);
     } 
}
Run Code Online (Sandbox Code Playgroud)

add(TimeStamped t, T data) 是类型安全但仍然不方便.

java generics

5
推荐指数
1
解决办法
100
查看次数

恒定"f"表达式的相关常数

我试图使用关联常量作为if-expression中的条件来初始化另一个常量.我认为这应该工作,因为我可以直接使用关联的常量初始化一些其他常量,因此它适用于const上下文并且if表达式不依赖于任何其他值.

trait C {
    const c: i32;
}

trait StaticAssert<T1: C, T2: C> {
    const canUseAssociatedConst: i32 = T1::c;
    const canCompareAssociatedConst: bool = T1::c == T2::c;

    const check: i32 = if T1::c == T2::c { 1 } else { 0 };
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我收到一个错误:

error[E0019]: constant contains unimplemented expression type
 --> src/lib.rs:9:24
  |
9 |     const check: i32 = if T1::c == T2::c { 1 } else { 0 };
  |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我不确定编译器想告诉我什么.我添加了i32后缀以强制文字实际上是i32值,以防止分支中不同类型的任何问题,但这也没有帮助.

rust associated-const

5
推荐指数
1
解决办法
145
查看次数

有没有办法使用布尔值作为枚举的基础类型?

我决定实现一个使用几个标志的协议,所以我开始enum为标志定义s.然而,当我想定义有两个值可以是一个标志true或者false我得到一个错误信息:

// The protocol definition says that the flag 
// can have two values true or false, so I could just use 
// plain bool, but I want another name for true and false.
enum Flag {
    ONE = true,
    TWO = false,
}
Run Code Online (Sandbox Code Playgroud)
error[E0308]: mismatched types
 --> src/lib.rs:5:11
  |
5 |     ONE = true,
  |           ^^^^ expected isize, found bool

error[E0308]: mismatched types
 --> src/lib.rs:6:11
  |
6 |     TWO = false,
  |           ^^^^^ …
Run Code Online (Sandbox Code Playgroud)

rust

1
推荐指数
1
解决办法
576
查看次数

标签 统计

java ×2

rust ×2

associated-const ×1

boost-range ×1

c++ ×1

gcov ×1

generics ×1

jls ×1

types ×1