Questions tagged «clang»

有关clang LLVM编译器前端的问题。对于有关C的一般问题,请使用C标记。


4
我可以在Xcode中使用C ++ 11吗?
我正在考虑auto在某些跨平台项目(Windows + Mac)中使用某些C ++ 11功能(例如)。在Windows上,Visual Studio支持即将到来的C ++ 11标准的某些部分,这将使我能够简化部分代码库,因此自然而然地,我将有兴趣开始使用这些功能。 但是据我所知,当前的XCode版本(3.2.4 + GCC 4.2)根本不支持任何C ++ 11功能。我可以以某种方式升级GCC版本或CLang版本吗?还是我应该只咬一口舌头,等待苹果在将来的某个时候打包新版本?
86 c++  xcode  gcc  c++11  clang 

1
clang的-Wweak-vtables是什么意思?
我基本上不了解clang -Wweak-vtables。到目前为止,这是我观察到的: 情况一:(触发警告) class A { public: virtual ~A(){} }; class B : public A { public: virtual ~B(){} }; int main(){} 情况二:(不触发警告) class A { public: virtual ~A(){} }; int main(){} 情况三:(不触发警告) class A { public: virtual ~A(); }; A::~A(){} class B : public A { public: virtual ~B(){} …
78 c++  clang 

3
如何从GCC / c装配件输出中消除“噪音”?
我想检查boost::variant在我的代码中应用的程序集输出,以查看优化了哪些中间调用。 当我编译以下示例(使用的GCC 5.3 g++ -O3 -std=c++14 -S)时,似乎编译器优化了所有内容并直接返回100: (...) main: .LFB9320: .cfi_startproc movl $100, %eax ret .cfi_endproc (...) #include <boost/variant.hpp> struct Foo { int get() { return 100; } }; struct Bar { int get() { return 999; } }; using Variant = boost::variant<Foo, Bar>; int run(Variant v) { return boost::apply_visitor([](auto& …
76 c++  gcc  assembly  clang 

5
是否允许编译器优化堆内存的分配?
考虑使用以下简单代码new(我知道没有delete[],但是与这个问题无关): int main() { int* mem = new int[100]; return 0; } 是否允许编译器优化new调用? 在我的研究中,g ++(5.2.0)和Visual Studio 2015不能优化new调用,而clang(3.0+)可以优化调用。所有测试均已启用了全部优化功能(对于g ++和clang为-O3,对于Visual Studio为Release模式)。 是不是 new幕后进行系统调用,从而使编译器无法(而且是非法的)优化它吗? 编辑:我现在已经从程序中排除了未定义的行为: #include <new> int main() { int* mem = new (std::nothrow) int[100]; return 0; } clang 3.0不再优化了,但是更高版本。 编辑2: #include <new> int main() { int* mem = new (std::nothrow) int[1000]; …

3
添加字符时,编译器停止优化未使用的字符串
我很好奇为什么下面的代码: #include <string> int main() { std::string a = "ABCDEFGHIJKLMNO"; } 当使用编译时,将-O3产生以下代码: main: # @main xor eax, eax ret (我完全理解不需要多余的,a因此编译器可以从生成的代码中完全忽略它) 但是以下程序: #include <string> int main() { std::string a = "ABCDEFGHIJKLMNOP"; // <-- !!! One Extra P } 产量: main: # @main push rbx sub rsp, 48 lea rbx, [rsp + …

1
将libstdc ++编译的库与clang ++ -stdlib = libc ++一起使用
我在Mac OS X(10.8.2)下使用C ++进行工作,最近我提出了使用C ++ 11功能的需求,这些功能可以通过使用libc ++ stdlib的clang ++编译器获得。但是,我还需要使用一些针对libstdc ++编译并链接的旧式库(来自MacPorts)。 这样做时,我遇到了链接错误,因为使用(例如)的遗留库的标头std::string需要针对std::__1::basic_string(即libc ++实现std::string)而不是针对std::basic_string实现进行解析。 有没有办法在开发中混合这两个库(例如,通过使用一些预处理器标志?)
72 c++  c++11  clang  libstdc++  libc++ 

3
静态变量链接错误
我在Mac上编写C ++代码。为什么在编译时出现此错误?: 架构i386的未定义符号:“ Log :: theString”,引用自:libTest.a(Log.o)ld中的Log :: method(std :: string)ld:找不到架构i386铛的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用) 不知道我的代码是否错误,或者我必须向Xcode添加其他标志。我当前的XCode配置是“静态库”项目的默认配置。 我的代码: Log.h ------------ #include <iostream> #include <string> using namespace std; class Log{ public: static void method(string arg); private: static string theString ; }; Log.cpp ---- #include "Log.h" #include <ostream> void Log::method(string arg){ theString = "hola"; cout << theString << …

2
为什么使用三元运算符返回字符串与返回等效的if / else块会产生截然不同的代码?
我在使用Compiler Explorer时,偶然发现使用三元运算符时会发生以下有趣的行为: std::string get_string(bool b) { return b ? "Hello" : "Stack-overflow"; } 编译器为此生成的代码(带有-O3的Clang干线)是这样的: get_string[abi:cxx11](bool): # @get_string[abi:cxx11](bool) push r15 push r14 push rbx mov rbx, rdi mov ecx, offset .L.str mov eax, offset .L.str.1 test esi, esi cmovne rax, rcx add rdi, 16 #< Why is the compiler storing the …


4
使用LLVM / Clang忽略特定文件中的所有警告
我的iOS项目中有一些带有警告的文件,我想忽略这些警告。我不想禁用整个项目中的警告(不知道如何执行此操作),仅禁用某些特定文件。因此,有没有一种方法可以完全忽略特定文件中的所有警告? 我在Xcode 4.2上使用LLVM 3.0和Clang。

3
lang语标志的完整列表
在哪里可以找到Clang标志的完整列表? 有些像-include-pch甚至没有出现在手册页中。:( 我知道GCC使用了一些相同的标志,但是它不包括-Os我认为仅在Clang中可用的东西的文档。有没有地方可以找到所有Clang选项的单个合并列表?
68 clang 

9
Catalina C ++:使用<cmath>标头会产生错误:全局名称空间中没有名为“ signbit”的成员
从Mojave升级到Catalina后,在环境中设置:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk。 我无法编译使用以下内容的程序 &lt;cmath&gt;标头。 我尝试更改CFLAGS,CCFLAGS,CXXFLAGS以指向没有任何改变的MacOSSDK位置 Scanning dependencies of target OgreMain /Applications/Xcode.app/Contents/Developer/usr/bin/make -f OgreMain/CMakeFiles/OgreMain.dir/build.make OgreMain/CMakeFiles/OgreMain.dir/build [ 0%] Building CXX object OgreMain/CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o cd /Users/roman/Downloads/ogre-1.12.2/build/OgreMain &amp;&amp; /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DOgreMain_EXPORTS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OSX -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include/Threading -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src -I/Users/roman/Downloads/ogre-1.12.2/build/Dependencies/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include -I/Users/roman/Downloads/ogre-1.12.2/build/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain -isystem /usr/local/include -Wall -Winit-self -Wcast-qual -Wwrite-strings -Wextra -Wundef -Wmissing-declarations -Wno-unused-parameter -Wshadow -Wno-missing-field-initializers -Wno-long-long -Wno-inconsistent-missing-override -msse -O3 -DNDEBUG -arch …

1
Clang不编译代码,但是gcc和msvc编译了它
我不明白这是什么问题:在我的代码中还是在编译器中(不太可能)。有一段这样的代码: #include &lt;iostream&gt; #include &lt;type_traits&gt; #include &lt;set&gt; template&lt;typename T, typename = void&gt; struct TestA: std::false_type {}; template&lt;typename T&gt; struct TestA&lt;T, std::void_t&lt;typename T::reverse_iterator&gt;&gt; : std::true_type {}; template&lt;typename T&gt; struct TestA&lt;T, std::void_t&lt;typename T::dummy_iterator&gt;&gt; : std::true_type {}; int main() { std::cout &lt;&lt; TestA&lt;std::set&lt;int&gt;&gt;::value; } GCC和MSVC都可以对其进行编译。我使用不同版本的GCC和MSVC 17(本地)和19在Godbolt上进行了测试。这是一个链接:https ://godbolt.org/z/Enfm6L 。 但是Clang不会编译它并发出错误: redefinition of `'TestA&lt;T, std::void_t&lt;typename …

1
为什么std :: swap在Clang / Win下的vector <bool>元素上不起作用?
我有这样的代码: #include &lt;vector&gt; #include &lt;utility&gt; int main() { std::vector&lt;bool&gt; vb{true, false}; std::swap(vb[0], vb[1]); } 关于是否理智的争论,在vector&lt;bool&gt;以下方面效果很好: Mac版Clang Windows的Visual Studio 适用于Linux的GCC 然后,我尝试在Windows上使用Clang构建它,并收到以下错误(摘要): error: no matching function for call to 'swap' std::swap(vb[0], vb[1]); ^~~~~~~~~ note: candidate function [with _Ty = std::_Vb_reference&lt;std::_Wrap_alloc&lt;std::allocator&lt;unsigned int&gt; &gt; &gt;, $1 = void] not viable: expects an l-value for …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.