小编ide*_*n42的帖子

如何在Rust中为单个语句安静警告?

假设有一个警告,例如path_statements,unused_variables.有没有办法忽略它的一个瞬间,而不将它们隔离成代码块或函数?

需要说明的是,代码中只有一个警告.我希望能够只安静警告,而不必针对特定警告进行特殊更改.并且在其他任何地方都没有这种安静的警告,甚至在同一个功能中也是如此.

使用GCC,可以按如下方式完成:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat"
    /* Isolated region which doesn't raise warnings! */
    this_would_raise_Wformat(args);
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

Rust具有相同的功能吗?


请注意,我正在询问如何安静警告的一般情况.我知道有办法解决未使用的var警告,例如.

warnings rust

13
推荐指数
2
解决办法
1329
查看次数

迭代切片的值而不是Rust中的引用?

当循环遍历一个结构片段时,我得到的值是一个引用(这很好),但是在某些情况下,必须var(*var)在很多地方一样编写它是很烦人的.

有没有更好的方法来避免重新声明变量?

fn my_fn(slice: &[MyStruct]) {
    for var in slice {
        let var = *var;  // <-- how to avoid this?

        // Without the line above, errors in comments occur:

        other_fn(var);  // <-- expected struct `MyStruct`, found reference

        if var != var.other {
            // ^^ trait `&MyStruct: std::cmp::PartialEq<MyStruct>>` not satisfied
            foo();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅:实际错误输出(更加神秘).

iterator rust

13
推荐指数
2
解决办法
3308
查看次数

不推荐使用 GNU GZIP 环境变量,如何通过 tar 控制 ZLIB 压缩?

目前我有一个使用GZIP环境变量设置压缩的脚本。

使用 gzip 1.8 我收到警告:

warning: GZIP environment variable is deprecated; use an alias or script
Run Code Online (Sandbox Code Playgroud)

应该如何调用 tar 以便设置压缩级别?

当前命令:

GZIP=-9 tar -zcf ...要压缩的文件...

compression gzip tar

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

对于不完整的结构使用堆栈内存的C最佳实践

有时我想要一个不完整的结构(只有一个C文件知道它的成员),所以我可以为任何操作定义一个API,因此开发人员不能轻易地在API之外操作它.

这样做的问题,它通常意味着你需要一个构造函数,它分配数据,并在(使用mallocfree)之后释放它.

在某些情况下,从内存管理的角度来看,这没什么意义,特别是如果struct它很小,并且分配和释放了很多.

所以我想知道什么是可移植的方法来保持成员本地的C源文件,并仍然使用堆栈分配.

当然这是C,如果有人想弄乱struct他们的内部,但我希望它可能会发出警告或错误.

例如,简单随机数生成器(为简洁起见,仅包括新/自由方法).

标题: rnd.h

struct RNG;
typedef struct RNG RNG;

struct RNG *rng_new(unsigned int seed);
void        rng_free(struct RNG *rng);
Run Code Online (Sandbox Code Playgroud)

资源: rnd.c

struct RNG {
    uint64_t X;
    uint64_t Y;
};

RNG *rng_new(unsigned int seed)
{
    RNG *rng = malloc(sizeof(*rng));
    /* example access */
    rng->X = seed;
    rng->Y = 1;
    return rng;
}

void rng_free(RNG *rng)
{
    free(rng);
}
Run Code Online (Sandbox Code Playgroud)

其他来源: other.c

#include "rnd.h"
void main(void)
{
    RND *rnd;

    rnd = …
Run Code Online (Sandbox Code Playgroud)

c struct memory-management

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

Python:如何检查项是否已添加到集合中,没有2x(散列,查找)

我想知道是否有一个清晰/简洁的方法来添加一些东西,并检查它是否添加没有2x哈希和查找.

这是你可能会做的,但它有2x hash的项目

if item not in some_set:  # <-- hash & lookup
    some_set.add(item)    # <-- hash & lookup, to check the item already is in the set

    other_task()
Run Code Online (Sandbox Code Playgroud)

这适用于单个散列和查找,但有点难看.

some_set_len = len(some_set)
some_set.add(item)
if some_set_len != len(some_set):

    other_task()
Run Code Online (Sandbox Code Playgroud)

使用Python的set api有更好的方法吗?

python set python-3.x

12
推荐指数
2
解决办法
2148
查看次数

使用编译器前缀命令与CMake(distcc,ccache)

有些实用程序通过添加命令作为前缀来使用现有编译器(因此,而不是调用cc -c file.c您可以调用distcc cc -c file.c).

使用CMake时,可以更改编译器命令,但是我遇到了尝试使用的问题distcc,尽管这可能适用于编译器的任何命令前缀(ccache也).

  • CMake希望编译器是一个绝对路径,
    所以设置CMAKE_C_COMPILER/usr/bin/distcc /usr/bin/cc,给出一个错误:

    /usr/bin/distcc /usr/bin/cc is not a full path to an existing compiler tool.

  • 在某些情况下将编译器设置为/usr/bin/distcc和/
    CMAKE_C_COMPILER_ARG1CMAKE_C_FLAGS开始/usr/bin/cc工作,但失败了CHECK_C_SOURCE_COMPILES
    (检查是否有某种方式来支持它,甚至前缀CMAKE_REQUIRED_FLAGS不起作用).

我发现这样做的唯一方法是将命令包装在shell脚本中.

#!/bin/sh
exec /usr/bin/distcc /usr/bin/cc "$@"
Run Code Online (Sandbox Code Playgroud)

虽然这很有效,但是能够将编译器助手与CMake一起使用会很好,而不必通过shell脚本(当构建系统只使用命令前缀时会产生一些小的开销).


所以我的问题是:

CMake可以直接使用编译器前缀命令(例如distcc)吗?没有shell脚本包装器?

c c++ build cmake

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

如何将枚举中的元素(变体)数量作为常量值?

有没有办法提取枚举中的元素数量?

简单的例子(用虚构的number_of_elements方法):

enum FooBar { A = 0, B, C, };

println!("Number of items: {}", FooBar.number_of_elements());
// "Number of items: 3"
Run Code Online (Sandbox Code Playgroud)

在C中,我通常会......

enum FooBar { A = 0, B, C, };
#define FOOBAR_NUMBER_OF_ITEMS (C + 1)
Run Code Online (Sandbox Code Playgroud)

但是相当于Rust的Rust不起作用:

enum FooBar { A = 0, B, C, };
const FOOBAR_NUMBER_OF_ITEMS: usize = (C as usize) + 1;

// Raises an error:
//     unimplemented constant expression: enum variants
Run Code Online (Sandbox Code Playgroud)

包括枚举中的最后一项是非常不方便的,因为如果不考虑所有成员,匹配的枚举将会出错.

enum FooBar { A = 0, B, C, FOOBAR_NUMBER_OF_ITEMS, };
Run Code Online (Sandbox Code Playgroud)

有没有办法将枚举中的项目数作为常量值?


注意:即使这与问题没有直接关系,我之所以想要这个功能,是因为我正在使用 …

enums rust

12
推荐指数
3
解决办法
2877
查看次数

清理svn checkout(删除非svn文件)

我想删除工作副本中svn存储库中未知的所有文件.

实际上好像我只是做了一个干净的结账,但我不想重新下载所有文件.

最接近我认为是......

rm -rf `svn st | grep "^?" | cut -d" " -f8`
Run Code Online (Sandbox Code Playgroud)

但这看起来很笨重,我并不完全信任它,因为输出的不一致可以消除svn之外的dirs.

"svn export"不是我想要的,因为我没有清理源代码来打包它,我只想删除cruft(*.pyc,*.orig,*.rej,svn-commit.tmp,*.SWP).

除了打扫干净外,还有更好的方法吗?

svn svn-checkout

11
推荐指数
2
解决办法
9814
查看次数

Python字典vs列表,哪个更快?

我正在编写一个欧拉问题,我遇到的问题引起了我的好奇心.我有两个代码片段.一个是列表,另一个是字典.

使用清单:

n=100000
num=[]
suma=0
for i in range(n,1,-1):
    tmp=tuple(set([n for n in factors(i)]))
    if len(tmp) != 2: continue
    if tmp not in num:
       num.append(tmp)
           suma+=i
Run Code Online (Sandbox Code Playgroud)

使用词典:

n=100000
num={}
suma=0
for i in range(n,1,-1):
   tmp=tuple(set([n for n in factors(i)]))
   if len(tmp) != 2: continue
   if tmp not in num:
      num[tmp]=i
      suma+=i
Run Code Online (Sandbox Code Playgroud)

我只关心表现.为什么使用字典的第二个示例运行速度非常快,比第一个带列表的示例快.字典的例子运行速度快了近三十倍!

我使用n = 1000000测试了这两个代码,第一个代码在1032秒内运行,第二个代码在3.3秒内运行,,, amazin'!

python performance dictionary list

11
推荐指数
3
解决办法
2万
查看次数

检查函数调用不作为参数传递(C宏)

在我工作的项目中,我们有一些实用程序宏,它们多次引用它们的参数.

让我们用一个简单的例子:

#define ABS(a)  ( (a) < 0 ? (-(a)) : (a) )
Run Code Online (Sandbox Code Playgroud)

现在这是一个很大的代码库,当我们检查代码时,我偶尔会发现一个函数调用被传递给宏.这不是错误,但它意味着多次进行函数调用,这通常是我不想要的.

在这种情况下,我们可以将其替换fabsf,fabs,abs用于float/ double/ int至少,但是让我们假设存在并不总是一个好的内置的更换和宏将留下一个宏.

例:

f = ABS(dot_v3v3(vel, sp));

/* expands into */
f = ( ( dot_v3v3(vel, sp) ) < 0 ? (-( dot_v3v3(vel, sp) )) : ( dot_v3v3(vel, sp) ) );
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

是否可以检测宏内使用的函数调用(警告或错误)?


部分解决方案:

以下是我已经检查过的一些事情......

比较指针

这将导致函数调用不编译,但缺点是像'1'这样的常量也会出现错误以及像(b-c)这样的表达式.

#define ABS(a)  ((void)((&a) == (&a)), ( (a) < 0 ? (-(a)) : (a) ))
Run Code Online (Sandbox Code Playgroud)

注意:我发现这已经非常方便地指出了一些不好的宏用法,但由于它有误报,所以它不能留下来.

C11泛型 …

c c-preprocessor

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