我有一个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)
没有任何额外的文字,正如预期的那样.
下一步是考虑在自动完成运行时是否可以有动态输出,例如,\ | / -在一个地方打印字符,就好像一条线在适当的位置旋转 - 以直观地指示正在发生的事情.这可能吗?
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我想要的方式失败?
我正在logging为十几个Python组件编写一个中央配置文件,我需要一个特定的记录器来记录UNIX时间格式的时间(毫秒或秒的分数,两者都很好).
有没有办法在配置文件中配置格式化程序,以便输出%(asctime)s?我试图避免在多个独立的Python脚本中修补一个Formatter实例,并且对日志文件进行后期处理是不可行的.
我们有一个列出一堆路径的文本文件,以及一个从该文件中读取行的批处理文件.
例如,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)
?
我们使用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)
configure.ac在选择编译器之后,定义特定于编译器的标志的最佳方法是什么,例如AC_PROG_CXX?我们AC_SUBST(AM_CXXFLAGS)所以我想我会在其中扩展编译器特定变量AM_CXXFLAGS.
在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或许已经定义了这样的事情?
我收到了很多关于这种形式的警告(为提高可读性添加了换行符):
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)
并且无法弄清楚该警告的原因或相关性。请注意,两个路径都解析到同一位置。
假设我想CFLAGS在我的configure脚本中添加一个特定的标志,它应该传播到所有子项目的configure脚本:
CFLAGS+=" -Dfoobar"
export CFLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)
这在configure被简单调用时有效。一旦发生以下情况之一:
CFLAGSconfigure调用时在环境中导出CFLAGS在configure命令行上设置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?
#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位,这可以发挥作用吗?
鉴于以下功能齐全的 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) autotools ×2
c++ ×2
autocomplete ×1
autoconf ×1
automake ×1
bash ×1
batch-file ×1
c ×1
c++-concepts ×1
c++-ts ×1
c++11 ×1
cflags ×1
clang ×1
closures ×1
command-line ×1
config-files ×1
gcc ×1
libtool ×1
logging ×1
perl ×1
python ×1
windows ×1