我刚刚在我的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适用于该版本.
我有一个基于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.
那么什么是真正的规范类型?
bits/c++config.h在cstring头文件所需的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
什么地方出了错?
我正在使用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
我建立铛由铛反对的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)首先,我使用gcc对libgcc和libstdc ++构建llvm,clang,libunwind并安装它们.在除了最后一个步骤之外的所有以下步骤中,我使用这个新鲜/ . …
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.请不要回答:"你的代码设计很糟糕".仔细阅读:问题不是代码设计.
给出以下代码:
#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++标准,哪一个是正确的?
大卫霍尔曼最近在推特上发布了以下示例(我稍微减少了):
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是 …我正在传递一个带有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 …
前段时间,GCC> = 5和Clang> = 4编译器改变了他们的版本号的语义,因此任何非bugfix版本的主版本号都会增加.
Apple在ABI兼容性或任何其他范围方面是否遵循任何带有clang编译器的版本模式?我想知道apple-clang 9.0ABI是否兼容9.1等等.