草庐IT

c++ - 引用 this 指针 : GCC vs clang

这是these的后续questions.考虑以下代码:structA{private:A*const&this_ref{this};};intmain(){Aa{};(void)a;}如果使用-Wextra编译,两者都是GCCv6.2和clangv3.9显示警告。无论如何,在下面显示的稍作修改的版本中,它们的行为有所不同:structA{A*const&this_ref{this};};intmain(){Aa{};(void)a;}在这种情况下GCC没有给出任何警告,clang给出与上一个示例中返回的警告相同的警告。警告几乎相同。它遵循来自clang的那个:3:warning:bin

c++ - clang 与 gcc : different code for volatile access

考虑这个例子:volatileunsignedintx;unsignedinty;voidf(){x/=2;}voidg(){y/=2;}当使用-Os编译时,clang-6.0在x64上为f和g生成相同的shrl(%rip)指令模式(见https://godbolt.org/g/hUPprL),而gcc-7.3为f()生成这个(见https://godbolt.org/g/vMcKVV):mov0x200b67(%rip),%eax#601034shr%eaxmov%eax,0x200b5f(%rip)#601034这只是一个错过的优化,还是gcc拒绝shrl(%rip)的理由?如果访

c++ - gcc 4.2 编译器 (Mac OSX) : fpu_control. h: 没有那个文件或目录的新手问题

我正在尝试用c/c++编译程序,但收到错误消息:fpu_control.h:没有那个文件或目录从谷歌,我发现这个问题是关于浮点精度的处理方式。我读到并非所有gcc发行版都包含fpu_control.h。这是我唯一能找到的东西。我进行了广泛的搜索,但找不到任何地方可以下载此fpu_control.h。谁能帮忙?谢谢大家 最佳答案 Apple不支持设置FPU标志,并且doingsoisn'tneeded.原因是theydon'tevenusethei387coprocessorforfloatanddouble,butSSE.最后一个引

c++ - 如何在 GCC 上创建 va_list?

我正在尝试转换一些代码,以便它也能在gcc上编译(现在,它只能在MSVC上编译)。我遇到的代码是伪格式化函数,它接受格式字符串和零个或多个参数作为输入(constchar*format,...)。然后它将处理一些占位符消耗一些参数,并将其余部分与动态生成的新va_list一起传递给vsprintf。这是生成新va_list的实际代码:char*new_args=(char*)malloc(sum);char*n=new_args;for(inti=0;i在我的辩护中,我没有也永远不会编写这段代码。事实上,我认为这是我一生中见过的最骇人听闻的事情之一。但是,这个函数非常复杂,非常古老,而

c++ - Make/gcc 神秘错误 2 : how to have more information?

我有一个使用Makefile编译的C++项目,有时当(我的猜测)缺少一些包含时,我会收到一条神秘的“错误2”消息,并且make进程停止。我怀疑缺少包含,因为这是我包含一个不存在的头文件时第三次发生这种情况。看起来像这样:----Buildtmp/foo.o--------Buildtmp/bar.o--------Buildtmp/toto.o--------Buildtmp/tata.o----make:***[build_Project]Error2这让我抓狂,因为即使使用冗长的命令(显示每个g++调用的地方),我也看不到任何东西。我原以为这家伙会抛出一些错误消息,例如“找不到he

c++ - 将 'using' 指令与部分重载 : gcc feature or intel bug? 相结合

我希望将一组用C++编写的库与英特尔编译器一起使用。我附上了演示问题的示例代码。库中有很多地方使用了“using”指令与部分重载的组合(例如,我想使用基类中的foo(void)方法,但在派生类中重新实现第二个版本fofoo).gcc没有问题,但intel有。#includetemplatestructInterface{staticconstFf=10;};templatestructBase:publicInterface{voidfoo(void){std::coutvoidfoo(Interface&ii){std::coutstructDerived:publicBase{//

c++ - 将 GCC 以外的其他编译器附加到 Windows 上的 Clion IDE

我正在使用Clion和minigw-w64进行开发。IDE使用cmake。我在GCC中发现了一个错误,它迫使我切换编译器,我别无选择。该错误与gcc如何处理堆栈对齐有关。Clion好像只支持windows上的minigw和cygwin,我相信这都是使用gcc编译器的工具集。有没有简单的方法让Clion/cmake使用不同的编译器?我读到clang与GCC非常相似,因为它接受相同的编译器标志,所以我想知道这是否是一个好的选择。我还读过你可以通过更改一些标志来更改cmake使用的编译器,但我不知道将它放在哪个文件中,或者如果更改它会破坏与Clion的兼容性。 最

c++ - 默认参数和参数包之间的交互(GCC 和 clang 不同意)

我希望编译以下代码:#includetemplatevoidprint(Tval=T{},Args...args){std::cout虽然它在GCC5.2(C++11)上编译,尽管有unused-but-set-parameter警告,但clang3.6(C++11)给出了以下错误消息:main.cpp:4:33:error:missingdefaultargumentonparameter'args'voidprint(Tval=T{},Args...args){^main.cpp:11:5:note:ininstantiationoffunctiontemplatespeciali

c++ - MSVC 与 GCC 与 sizeof 的行为不一致

考虑以下代码:#includeclassA{public:structB{intM;};staticvoidStaticFunc();};voidA::StaticFunc(){conststd::size_ts0=sizeof(::A::B::M);conststd::size_ts1=sizeof(A::B::M);conststd::size_ts2=sizeof(B::M);}intmain(){conststd::size_ts3=sizeof(A::B::M);return0;}GCCcompilesit,只是警告未使用的变量。但是VisualC++2015无法编译它:er

c++ - __has_trivial_copy 在 clang 和 gcc 中的行为不同。谁是对的?

std::is_trivially_copyable在这两个编译器中仍然不被支持(至少gcc4.6是这样)。但是两者都提供了做得很好的__has_trivial_copy指令。除非涉及到已删除的复制构造函数。structA{A(Aconst&)=delete;};__has_trivial_copy(A)在clang中返回1,在gcc中返回0。我正在研究标准,但找不到说明删除复制构造函数时类是否仍被视为可平凡复制的条款。谁是对的?我倾向于相信gcc是正确的,因为structA根本不可复制,更不用说可复制了。此外,有一个广泛的共识,即删除的复制构造函数可以被视为私有(private)声明