标签: clang++

在Ubuntu上安装了clang ++ 3.6,无法选择替代

我刚刚在我的Ubuntu机器上安装了clang ++ 3.6,但无法将其设置为默认的c ++编译器.

sudo update-alternatives --config c++ 
Run Code Online (Sandbox Code Playgroud)

告诉我

There is only one alternative in link group c++ (providing /usr/bin/c++): /usr/bin/g++
Nothing to configure.
Run Code Online (Sandbox Code Playgroud)

和clang ++没有显示出来

sudo update-alternatives --query c++
Run Code Online (Sandbox Code Playgroud)

要么(这是预期的).但编译器肯定有效:

which clang++-3.6 
/usr/bin/clang++-3.6
Run Code Online (Sandbox Code Playgroud)

我的操作系统版本是Ubuntu 14.04.1 LTS.

我需要做些什么来update-alternatives包括clang ++ 3.6?

注意:我之前使用过clang3.4,但删除了它,因为它不支持我需要的所有c ++ 11功能.这似乎只是安装clang ++包时安装的版本(我特意安装了clang ++ 3.6); update-alternativesDID适用于该版本.

linux ubuntu clang++

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

Clang的规范类型是什么?

我有一个基于clang的简单头解析器,我从某个源获取typedef.

struct _poire {
int g;
tomate rouge;
};
typedef struct _poire kudamono;
Run Code Online (Sandbox Code Playgroud)

解析后我有一个clang::TypedefDecl然后我得到clang::QualType了typedefclang::TypedefDecl::getUnderlyingType()

随着QualType如果我使用getAsString方法,我可以找到"结构_poire" std::string.这一切都很好.

问题是,如果我试图查看此类型是否为规范类型QualType::isCanonical(),则返回false.

所以我尝试获取规范类型,QualType::getCanonicalType().getAsString()并返回相同的字符串"struct _poire".

根据类型http://clang.llvm.org/docs/InternalsManual.html#canonical-types上的clang引用,我认为当没有涉及typedef时,isCanonical()应该返回true.

那么什么是真正的规范类型?

c c++ llvm clang clang++

21
推荐指数
1
解决办法
5291
查看次数

g ++ 4.6根据头文件cstring的要求不发出<bits/c ++ config.h>文件

bits/c++config.hcstring头文件所需的c ++ include目录中没有调用文件.但是当我包含标题cstring并编译时g++,它不会给我错误.当我尝试使用clang++ 编译器以下列方式编译程序时,问题就出现了.

$clang++ -cc1 -I/usr/include -I/usr/include/c++/4.6.1 -I/usr/lib/gcc/i686-linux-gnu/4.6.1 -I/usr/include/i386-linux-gnu -I opt_149739_build/include hello.cpp

In file included from /media/space/hello.cpp:2:
In file included from /media/space/opt_149739_build/include/clang/Driver/Driver.h:13:
In file included from /media/space/opt_149739_build/include/clang/Basic/Diagnostic.h:17:
In file included from /media/space/opt_149739_build/include/clang/Basic/DiagnosticIDs.h:18:
In file included from /media/space/opt_149739_build/include/llvm/ADT/StringRef.h:14:
/usr/include/c++/4.6.1/cstring:42:10: fatal error: 'bits/c++config.h' file not found
#include <bits/c++config.h>
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 11.04上使用g ++ 4.6.1

什么地方出了错?

c++ g++ clang cstring clang++

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

如果语句包含宏,则clang无法替换语句

我正在使用clang尝试解析(使用C++ API)一些C++文件并使所有case-break对使用特定的样式.

示例:

**Original**

switch(...)
{
   case 1:
   {
      <code>
   }break;

   case 2:
   {
      <code>
      break;
   }
}

**After replacement**

switch(...)
{
   case 1:
   {
      <code>
      break;
   }

   case 2:
   {
      <code>
      break;
   }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,如果代码部分不包含任何宏,我到底做了什么.我的问题是:clang处理扩展(如果我转换一个有问题的语句,它将显示扩展版本)宏是否有所不同?如果是这样我怎么能让它工作?

可能有用的其他信息:

我正在使用Rewriter :: ReplaceStmt用新创建的CompoundStmt替换每个案例的子语句,我注意到如果"from"参数包含一个宏,则replaceStmt返回true,并且该方法返回true的唯一方法是if

Rewriter :: getRangeSize(from-> getSourceRange())

返回-1

c++ clang clang++

20
推荐指数
2
解决办法
2568
查看次数

如何强制clang默认使用某些库?

我建立反对的libc ++,的libc ++ ABI,编译器RT在下面的步骤:

  • 要下载(和更新)llvm和子项目,我使用以下脚本:

    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
    svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk clang/tools/extra
    svn co http://llvm.org/svn/llvm-project/lldb/trunk lldb
    svn co http://llvm.org/svn/llvm-project/lld/trunk lld
    svn co http://llvm.org/svn/llvm-project/polly/trunk polly
    cd ../projects/
    svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
    svn co http://llvm.org/svn/llvm-project/libunwind/trunk libunwind
    svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp
    svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
    svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
    
    Run Code Online (Sandbox Code Playgroud)
  • 首先,我使用gcclibgcclibstdc ++构建llvm,clang,libunwind并安装它们.在除了最后一个步骤之外的所有以下步骤中,我使用这个新鲜/ . …

c++ build llvm clang clang++

20
推荐指数
1
解决办法
1138
查看次数

检测悬空引用临时

Clang 3.9非常重用临时使用的内存.

此代码是UB(简化代码):

template <class T>
class my_optional
{
public:
    bool has{ false };
    T value;

    const T& get_or_default(const T& def)
    {
        return has ? value : def;
    }
};

void use(const std::string& s)
{
    // ...
}

int main()
{
    my_optional<std::string> m;
    // ...
    const std::string& s = m.get_or_default("default value");
    use(s); // s is dangling if default returned
}
Run Code Online (Sandbox Code Playgroud)

我们有大量类似上面的代码(my_optional只是一个简单的例子来说明它).

因为UB所有的clang编译器从3.9开始重用这个内存,而且它是合法的行为.

问题是:如何在编译时检测这种悬空引用,或者在运行时检测清理程序?没有clang消毒剂可以检测到它们.

UPD.请不要回答:"使用std::optional".仔细阅读:问题不是关于它.
UPD2.请不要回答:"你的代码设计很糟糕".仔细阅读:问题不是代码设计.

c++ undefined-behavior c++11 clang++ dangling-pointer

20
推荐指数
1
解决办法
1781
查看次数

在转换为std :: optional <T>时,Clang和GCC的结果不同

给出以下代码:

#include <iostream>
#include <optional>

struct foo
{
    explicit operator std::optional<int>() {
        return std::optional<int>( 1 );
    }
    explicit operator int() {
        return 0;
    }
};

int main()
{
    foo my_foo;
    std::optional<int> my_opt( my_foo );
    std::cout << "value: " << my_opt.value() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

gcc 7.2.0写道 value: 1.

MSVC 2017(15.3)和clang 4.0.0然而写 value: 0.

根据C++标准,哪一个是正确的?

c++ g++ optional clang++ c++17

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

标准布局和尾部填充

大卫霍尔曼最近在推特上发布了以下示例(我稍微减少了):

struct FooBeforeBase {
    double d;
    bool b[4];
};

struct FooBefore : FooBeforeBase {
    float value;
};

static_assert(sizeof(FooBefore) > 16);

//----------------------------------------------------

struct FooAfterBase {
protected:
    double d;
public:  
    bool b[4];
};

struct FooAfter : FooAfterBase {
    float value;
};

static_assert(sizeof(FooAfter) == 16);
Run Code Online (Sandbox Code Playgroud)

您可以检查godbolt上的clang中的布局,并查看大小更改的原因是,FooBefore成员value放置在偏移16处(保持完全对齐8 FooBeforeBase)而在FooAfter,成员value放置在偏移12处(有效地使用FooAfterBase的尾巴填充).

我很清楚这FooBeforeBase是标准布局,但FooAfterBase不是(因为它的非静态数据成员并不都具有相同的访问控制,[class.prop]/3).但是FooBeforeBase,标准布局需要这方面的填充字节是什么呢?

gcc和clang都重用了FooAfterBase填充,最后用了sizeof(FooAfter) == 16.但是MSVC没有,结果是24.每个标准是否有必要的布局,如果没有,为什么gcc和clang做他们做的事情?


有一些混乱,所以只是为了清理:

  • FooBeforeBase 是标准布局
  • FooBefore是 …

c++ g++ language-lawyer standard-layout clang++

20
推荐指数
1
解决办法
595
查看次数

为什么我得到一个未使用的lambda捕获警告?

我正在传递一个带有init捕获循环计数器的lambda,如下所示:

#include <iostream>

auto sq(int c, int x) { return c * x * x; }

struct S {
    template<class Fun>
    void for_each(Fun fun) const {
        for (auto i = 1; i < 4; ++i) {
            fun(i);    
        }
    }    
};

int main()
{
    S s;
    auto sum = 0;
    s.for_each([&, i = 2](auto c) mutable {
        sum += sq(c, i++);    
    });
    std::cout << sum;   // 70 = 1 * 4 + 2 * 9 + 3 * 16
}
Run Code Online (Sandbox Code Playgroud)

对于g …

c++ lambda compiler-warnings clang++ c++14

19
推荐指数
1
解决办法
2199
查看次数

Apple clang编译器版本架构?

前段时间,GCC> = 5Clang> = 4编译器改变了他们的版本号的语义,因此任何非bugfix版本的主版本号都会增加.

Apple在ABI兼容性或任何其他范围方面是否遵循任何带有clang编译器的版本模式?我想知道apple-clang 9.0ABI是否兼容9.1等等.

c++ xcode abi clang clang++

19
推荐指数
1
解决办法
1092
查看次数