我碰到一个C++之间不一致gcc
(版本4.8.1
,4.8.2
)和clang
(版本3.3
,3.4
).我想知道哪一个是正确的.这是程序:
template < typename T > struct Result {};
template < typename T > struct Empty {};
template < typename T >
struct Bad_Type_Fcn {
typedef typename Empty< T >::type type;
};
template < typename T >
Result< T >
f( const T& ) {
return Result< T >();
}
template< class U >
Result< typename Bad_Type_Fcn< U >::type >
f( const U&, int ) {
return Result< …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用autoconf
&的C++项目,automake
我正在努力正确设置包含路径*CPPFLAGS
.我已经阅读了大约3个小时的文件,我还想不通.我不是在寻找黑客,而是寻找正确的方法.这是我的难题.
在我看来,包含路径有3个完全不同的来源:
configure --with-XXX=<PATH>
.#include <file.h>
即使file.h
是包的一部分也使用,所以为了编译它们,我必须正确设置包含路径.(注意,它不是编辑所有这些文件的选项.)CPPFLAGS
.在我目前的设置中:
configure.ac
通过AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
.Makefile.am
通过test_CPPFLAGS = -I<path>
.CPPFLAGS
在运行之前设置,则会make
覆盖类型1设置,从而导致编译失败.当然,用户可以尝试使用CXXFLAGS
,但是那个用户有不同的用途(记住,我要求正确的方法来做到这一点,而不是黑客).我尝试通过使用AM_CPPFLAGS
inside 设置Type 1路径来解决这个问题configure.ac
.(供参考:如果您设置AM_CPPFLAGS
而不是CPPFLAGS
,但仍需要运行某些检查AC_CHECK_HEADERS
,则需要临时设置CPPFLAGS
然后还原它以使检查起作用;这将在此处解释.)这样可以释放CPPFLAGS
类型3路径,但不幸的是,编译失败,因为只有没有专门存在的情况下Makefile
才会生成-s .因此,如果存在类型2路径,则编译将失败,因为它不会获得类型1路径.configure
AM_CPPFLAGS
<target>_CPPFLAGS
test_CPPFLAGS
test
修复方法是指定内部Makefile.am
始终使用AM_CPPFLAGS
.但这是"按书"吗?我可以以全局方式执行此操作,还是必须编辑每个单独的target_CPPFLAGS
?还有其他"正确"的解决方案吗?
我正在尝试编写一个包装器,它将脚本作为会话负责人执行.我对linux命令的行为感到困惑setsid
.考虑这个脚本,称为test.sh
:
#!/bin/bash
SID=$(ps -p $$ --no-headers -o sid)
if [ $# -ge 1 -a $$ -ne $SID ] ; then
setsid bash test.sh
echo pid=$$ ppid=$PPID sid=$SID parent
else
sleep 2
echo pid=$$ ppid=$PPID sid=$SID child
sleep 2
fi
Run Code Online (Sandbox Code Playgroud)
输出因执行或来源而异:
$ bash
$ SID=$(ps -p $$ --no-headers -o sid)
$ echo pid=$$ ppid=$PPID sid=$SID
pid=9213 ppid=9104 sid= 9104
$ ./test.sh 1 ; sleep 5
pid=9326 ppid=9324 sid= 9326 child
pid=9324 ppid=9213 sid= 9104 parent
$ . …
Run Code Online (Sandbox Code Playgroud) 我正在尝试合并UNIX/Linux脚本中的许多已排序文件sort -m
,我注意到sort
首先将结果写入临时文件,然后将其复制到目标.我的理解-m
是它假定文件是排序的,所以使用临时文件是完全没必要的,它浪费了硬盘空间和CPU周期(我sort
在管道中使用,等待排序输出任何东西.)有没有办法告诉sort
合并排序文件时不使用临时文件?或者更好的版本没有?
确切的CL看起来像:
$ sort -m -s -t '_' -k 1,1n -k 2,2n <(gunzip <file_1) [...] <(gunzip <file_n) | gzip >output
Run Code Online (Sandbox Code Playgroud)
我正在使用sort
GNU coreutils 5.97.
我需要使用备用glibc
版本,比我系统上安装的版本更新(2.18
vs 2.15
).这里和这里都涉及几个相关的问题
.我在这里问的具体问题如下:
我成立了新的动态连接的库路径(ld-2.18.so
),以使新的libc
(libc-2.18.so
)被发现提前老libc
(libc-2.15.so
).但是,当我尝试使用新程序运行程序时ld
,旧版本libc
被选中,生成一个SEGV
.为什么会这样?
注意:我知道这可以通过--rpath
在编译时或LD_LIBRARY_PATH
运行时使用来修复.但是,我仍然想了解为什么还需要其中一个.
详情如下:
我下载glibc-2.18
并构建了它/opt/glibc-2.18
.默认情况下,文件/opt/glibc-2.18/etc/ld.so.conf
丢失.我创建了它,并更新了新的库缓存,glibc
如下所示.我强调:新的libc
是在旧的之前找到的libc
:
$ cat /opt/glibc-2.18/etc/ld.so.conf
/opt/glibc-2.18/lib
/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa
/lib
/usr/lib
$ /opt/glibc-2.18/sbin/ldconfig -v |& grep -E '^[^'$'\t'']|libc\.'
/opt/glibc-2.18/sbin/ldconfig: Path `/opt/glibc-2.18/lib' given more than once
/opt/glibc-2.18/sbin/ldconfig: Can't stat /opt/glibc-2.18/lib64: No such …
Run Code Online (Sandbox Code Playgroud) 我试图std::is_convertible
在C++ 11中理解.根据cppreference.com,std::is_convertible<T,U>::value
应该评估为1 iff"如果T
在返回的函数的return语句中可以使用类型的假想rvalue U
".但是,措辞没有说明可能宣布该职能的位置.当复制构造函数U
是私有时,人们应该期待什么?人们期待什么T
是左值参考?
例如,考虑以下代码:
#include <iostream>
#include <type_traits>
struct Fact_A;
struct A {
friend struct Fact_A;
A() = default;
A(A&&) = delete;
private:
A(const A&) = default;
};
struct Ref_A {
A* _ptr;
Ref_A(A* ptr) : _ptr(ptr) {}
operator A& () { return *_ptr; }
};
struct Fact_A {
static A* make_A(const A& a) { return new A(a); }
static A f(A* a_ptr) { return Ref_A(a_ptr); …
Run Code Online (Sandbox Code Playgroud) 是否有标准sort
命令的多线程版本?我正在寻找一些可以作为输入使用最大线程数的东西,可能是给定数量的RAM,加上标准sort
选项,然后运行.
我试图用来std::uniform_real_distribution<float>(a, b)
生成随机浮点数,我发现输出等于上限的情况b
.根据:http
:
//www.cplusplus.com/reference/random/uniform_real_distribution http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution
这不应该发生.
既gcc-4.9.2
和clang-3.5.0
,下面的崩溃对我来说:
#include <iomanip>
#include <iostream>
#include <limits>
#include <random>
int main() {
float a = 1.0f;
float b = 1.001f;
size_t seed = 293846;
size_t n = 9830;
std::mt19937 rg(seed);
std::uniform_real_distribution< float > u(a, b);
for (size_t i = 0; i < n; ++i) {
float v = u(rg);
if (not (v < b)) {
std::cerr << "error: i=" << i
<< " v=" << …
Run Code Online (Sandbox Code Playgroud)