小编Mat*_*vid的帖子

Gcc和clang之间的C++不一致

我碰到一个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)

c++ gcc clang template-specialization language-lawyer

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

如何使用autotools设置包含路径

我正在开发一个使用autoconf&的C++项目,automake我正在努力正确设置包含路径*CPPFLAGS.我已经阅读了大约3个小时的文件,我还想不通.我不是在寻找黑客,而是寻找正确的方法.这是我的难题.

在我看来,包含路径有3个完全不同的来源:

  1. 必须与我的包一起安装的外部库,由我们配置configure --with-XXX=<PATH>.
  2. 在我的包中,一些源文件#include <file.h>即使file.h是包的一部分也使用,所以为了编译它们,我必须正确设置包含路径.(注意,它不是编辑所有这些文件的选项.)
  3. 异想天开(或不是)标准指定必须允许用户指定自己的(额外)包含路径.也就是说,我根本不应该设置CPPFLAGS.

在我目前的设置中:

  • 类型1路径设定内部configure.ac通过AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>").
  • 类型2路径设定内部Makefile.am通过test_CPPFLAGS = -I<path>.
  • 无法设置类型3.更确切地说,如果用户CPPFLAGS在运行之前设置,则会make覆盖类型1设置,从而导致编译失败.当然,用户可以尝试使用CXXFLAGS,但是那个用户有不同的用途(记住,我要求正确的方法来做到这一点,而不是黑客).

我尝试通过使用AM_CPPFLAGSinside 设置Type 1路径来解决这个问题configure.ac.(供参考:如果您设置AM_CPPFLAGS而不是CPPFLAGS,但仍需要运行某些检查AC_CHECK_HEADERS,则需要临时设置CPPFLAGS然后还原它以使检查起作用;这将在此处解释.)这样可以释放CPPFLAGS类型3路径,但不幸的是,编译失败,因为只有没有专门存在的情况下Makefile才会生成-s .因此,如果存在类型2路径,则编译将失败,因为它不会获得类型1路径.configureAM_CPPFLAGS<target>_CPPFLAGStest_CPPFLAGStest

修复方法是指定内部Makefile.am始终使用AM_CPPFLAGS.但这是"按书"吗?我可以以全局方式执行此操作,还是必须编辑每个单独的target_CPPFLAGS?还有其他"正确"的解决方案吗?

automake autoconf autotools include-path

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

linux命令setsid

我正在尝试编写一个包装器,它将脚本作为会话负责人执行.我对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)

bash sessionid

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

如何在不使用临时文件的情况下合并排序文件?

我正在尝试合并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)

我正在使用sortGNU coreutils 5.97.

unix sorting command-line temporary-files

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

备用glibc动态链接器的库路径顺序(ld.so)

我需要使用备用glibc版本,比我系统上安装的版本更新(2.18vs 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)

linux glibc shared-libraries dynamic-linking ld

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

具有私有拷贝构造函数的C++ 11 std :: is_convertible行为

我试图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)

c++ std type-traits language-lawyer c++11

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

多线程排序

是否有标准sort命令的多线程版本?我正在寻找一些可以作为输入使用最大线程数的东西,可能是给定数量的RAM,加上标准sort选项,然后运行.

sorting multithreading

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

统一实际分布中的c ++错误?

我试图用来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.2clang-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)

c++ gcc stl clang standard-library

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