小编Irf*_*rfy的帖子

Bash:在长时间自动完成期间显示进度指示器

我有一个bash自动完成功能,它可以查询数据库,为bash中的当前命令行提供可能的完成.完成大约需要3秒钟,在此期间用户没有任何迹象表明他已触发自动完成 - 提示他按下TAB几次,导致自动完成功能可能会再运行几次.

一旦启动自动完成,是否可以以某种方式操作命令行以显示正在执行的操作?例如,当我TAB在命令后按两次foo,我希望立即发生以下情况:

$ foo
autocompleting...
Run Code Online (Sandbox Code Playgroud)

然后在确定可能的完成后,改为:

$ foo
bar        baz        jazz
Run Code Online (Sandbox Code Playgroud)

或者,如果我输入foo j并按TAB一次,则以下内容:

$ foo j
autocompleting...
Run Code Online (Sandbox Code Playgroud)

应该改为

$ foo jazz
Run Code Online (Sandbox Code Playgroud)

没有任何额外的文字,正如预期的那样.

下一步是考虑在自动完成运行时是否可以有动态输出,例如,\ | / -在一个地方打印字符,就好像一条线在适当的位置旋转 - 以直观地指示正在发生的事情.这可能吗?

bash autocomplete

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

static_assert具有部分模板特化

template<typename T, typename U = void>
struct S { /* static_assert(0, "type unsupported"); */ };
template<typename T>
struct S<T, typename std::enable_if<std::is_integral<T>::value, void>::type> {
    void foo() {}
};
...
S<int> i;
i.foo();
S<double> d;
// d.foo();
Run Code Online (Sandbox Code Playgroud)

我希望"主模板"永远不会被实例化int,但如果我取消注释static_assert,S<int>实例化将失败.即使是单独的typedef S<int> Si;也无法编译.(GCC 4.9.2 Cygwin)

我想要实现的不是S<double>foo()调用时失败,而是在模板本身的实例化中,以及带有意义的错误消息.我知道我可以typename T::nonexistent_type t;在主模板中执行某些操作,这将阻止模板进行编译,但这不如static_assert消息.(注意:将static_assert函数定义放在主模板中仍然无法编译S<int>)

为什么static_assert即使该模板未实例化也会失败?这个标准是强制性的(或者可能是"未指明的")吗?有没有办法以static_assert我想要的方式失败?

static-assert template-specialization c++11

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

有没有办法通过配置文件配置Python日志格式化程序以将时间记录为Unix时间戳?

我正在logging为十几个Python组件编写一个中央配置文件,我需要一个特定的记录器来记录UNIX时间格式的时间(毫秒或秒的分数,两者都很好).

有没有办法在配置文件中配置格式化程序,以便输出%(asctime)s?我试图避免在多个独立的Python脚本中修补一个Formatter实例,并且对日志文件进行后期处理是不可行的.

相关:Python日志记录:覆盖日志时间

python logging config-files

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

Windows批处理编程:间接/嵌套变量评估

我们有一个列出一堆路径的文本文件,以及一个从该文件中读取行的批处理文件.

例如,TargetFolders.txt可能包含以下行:

%ProgramFiles%\Acme\FooBar %VersionNumber%
Run Code Online (Sandbox Code Playgroud)

当然,当我们从文本文件中读取这一行时(使用FOR命令),变量%% I接收实际行文本,使用%符号而不是替换变量值.所以,

SET VersionNumber=7.0
FOR /F "eol=; delims=" %%I IN (TargetFolders.txt) DO (
    echo Folder: %%I
)
Run Code Online (Sandbox Code Playgroud)

打印

Folder: %ProgramFiles%\Acme\FooBar %VersionNumber%
Run Code Online (Sandbox Code Playgroud)

如何使它替换实际的变量值,以便打印

Folder: C:\Program Files\Acme\FooBar 7.0
Run Code Online (Sandbox Code Playgroud)

windows command-line batch-file

5
推荐指数
2
解决办法
5260
查看次数

如何使用autotools设置特定于编译器的标志

我们使用autotools作为构建基础架构,我们使用clang和gcc作为编译器.最近我们遇到了需要的gcc警告

--param max-vartrack-size=100000000
Run Code Online (Sandbox Code Playgroud)

沉默(没有完全禁用gcc的vartracking).Clang不接受该选项并生产

argument unused during compilation: '--param max-vartrack-size=100000000'
Run Code Online (Sandbox Code Playgroud)

为了保持沉默,铿锵需要

-Qunused-arguments
Run Code Online (Sandbox Code Playgroud)

并在gcc下产生错误:

unrecognized command line option ‘-Qunused-arguments’
Run Code Online (Sandbox Code Playgroud)
  1. configure.ac在选择编译器之后,定义特定于编译器的标志的最佳方法是什么,例如AC_PROG_CXX?我们AC_SUBST(AM_CXXFLAGS)所以我想我会在其中扩展编译器特定变量AM_CXXFLAGS.

  2. Makefile.am一个编译器中启用每个目标选项的正确方法是什么?我在考虑:

    if HAVE_GCC
        SPECIFIC_CXXFLAGS = --param...
    endif
    if HAVE_CLANG
        SPECIFIC_CXXFLAGS = -Q...
    endif
    libfoo_la_CXXFLAGS = $(AM_CXXFLAGS) $(SPECIFIC_CXXFLAGS)
    
    Run Code Online (Sandbox Code Playgroud)

但我需要HAVE_*从configure.ac中取代变量.不要AC_PROG_CXX/CC或许已经定义了这样的事情?

gcc autotools clang compiler-options

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

libtool:链接:警告:... / libstdc ++。la似乎已移动

我收到了很多关于这种形式的警告(为提高可读性添加了换行符):

libtool: link: warning: `/usr/local/gcc-5.2.0/lib/gcc/x86_64-unknown-linux-gnu/
    5.2.0/../../../../lib64/libstdc++.la' seems to be moved
Run Code Online (Sandbox Code Playgroud)

并且无法弄清楚该警告的原因或相关性。请注意,两个路径都解析到同一位置。

libtool

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

更改 configure.ac 中的 *FLAGS 与使用子项目缓存

假设我想CFLAGS在我的configure脚本中添加一个特定的标志,它应该传播到所有子项目的configure脚本:

CFLAGS+=" -Dfoobar"
export CFLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)

这在configure被简单调用时有效。一旦发生以下情况之一:

  1. CFLAGSconfigure调用时在环境中导出
  2. CFLAGSconfigure命令行上设置
  3. 使用缓存 ( configure -C)

这种方法不再有效。在前两种情况下,exportedCFLAGS被简单地忽略了;在最后一个中,configure失败了

配置:错误:上次运行中未设置“CFLAGS”


我设法通过以下方式使其可靠地工作:

AM_CFLAGS+=" -Dfoobar"
export AM_CFLAGS
AC_SUBST([AM_CFLAGS]) # repeat this line in every configure.ac for each *FLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)

考虑到有多个子项目,并且*FLAGS可能需要像这样设置多个变量,这虽然半途而废,但仍然是次优的。有没有办法通过只破解顶级来完成这项工作configure.ac

automake autoconf autotools cflags

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

了解2 ^ 31和-2 ^ 31整数提升

#include <stdio.h>

int main() {
    printf("sizeof(int): %zu\n", sizeof(int));
    printf("%d\n", 2147483648u > -2147483648);
    printf("%d\n", ((unsigned int)2147483648u) > ((int)-2147483648));
    printf("%d\n", 2147483648u != -2147483648);
    printf("%d\n", ((unsigned int)2147483648u) != ((int)-2147483648));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C和C++中,在cygwin64和带有gcc 5.2.0的rhel6.4机器上输出此代码是:

sizeof(int): 4
1
0
1
0
Run Code Online (Sandbox Code Playgroud)

根据" 整数促销 ",2147483648u将是类型unsigned int(即使没有u后缀)和-2147483648类型int(像往常一样).为什么显式铸造的结果不同?

根据" 常用算术转换 ",本段适用:

否则,签名是不同的:如果具有无符号类型的操作数的转换等级大于或等于带符号操作数的类型的等级,则带有签名类型的操作数将隐式转换为无符号类型

这意味着正确的结果就像:

2147483648u > 2147483648u
2147483648u != 2147483648u
Run Code Online (Sandbox Code Playgroud)

执行,因为在32位中,带符号-2 ^ 31和无符号2 ^ 31具有相同的表示.换句话说,铸造的结果是正确的.到底是怎么回事?

我感觉不知何故,在没有强制转换的情况下应用了更高级别的整数提升,所以我在双方都获得了例如64位签名促销 - 但为什么呢?

这两个可执行文件都编译为64位,这可以发挥作用吗?

c c++ integer-promotion implicit-conversion

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

如何通过 last/next 强制退出 perl 子例程/关闭以使程序自动失败?

鉴于以下功能齐全的 perl 脚本和模块:

tx_exec.pl :

#!/usr/bin/perl

use strict; # make sure $PWD is in your PERL5LIB
# no warnings!

use tx_exec qw(tx_exec);

tx_exec ("normal", sub { return "foobar"; });
tx_exec ("die", sub { die "barbaz\n"; });
tx_exec ("last", sub { last; });
tx_exec ("next", sub { next; });
Run Code Online (Sandbox Code Playgroud)

tx_exec.pm :

package tx_exec;

use strict;
use warnings;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(tx_exec);

my $MAX_TRIES = 3;

sub tx_exec {
    my ($desc, $sub, $args) = @_;
    print …
Run Code Online (Sandbox Code Playgroud)

perl closures

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

为什么在C++ Concepts TS中有变量和函数概念?

我一直在研究在GCC 6中实现的C++ 1z N4377概念TS草案,我不明白有两种不同概念的目的:变量概念和函数概念.

功能概念草案的相关部分是[dcl.spec.concept(5.4)]

  • 声明应具有相当于一个功能体{ return E; },其中E是一个约束表达式(14.10.1.3).

对于可变概念,在下一段[(6.3)]中:

  • 初始化器应该是约束表达式.

他们中有什么能做的,对方不能吗?如果没有,是否有理由将两者都包括在内?

注意:最新草案P0121R0在这方面没有任何改变

c++ c++-concepts c++-ts

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