草庐IT

c++ - 使用元编程的私有(private)成员存在性测试,GCC vs clang,哪个是对的?

这更像是一个C++标准问题。考虑以下代码:templateclasshas_Data{typedefcharone;typedeflongtwo;templatestaticonetest(typeof(&C::Data));templatestatictwotest(...);public:enum{value=sizeof(test(0))==sizeof(char)};};classMyClass{private:structData{};};voidfunction(boolval=has_Data::value){}以上代码适用于gcc(GCC)4.4.3但是clang版本3

c++ - GCC 无法向量化这个简单的循环 ('number of iterations cannot be computed' ) 却在同一代码中管理了一个类似的循环?

所以,我有这个循环的C++代码:for(i=0;i所有涉及的数量都是int的。从GCC的矢量化报告中我得到:babar.cpp:233:note:=====analyze_loop_nest=====babar.cpp:233:note:===vect_analyze_loop_form===babar.cpp:233:note:===get_loop_niters===babar.cpp:233:note:notvectorized:numberofiterationscannotbecomputed.babar.cpp:233:note:badloopform.我想知道为什么“无法

c++ - 使用 gcc 插件插入全局变量声明

我想知道是否可以使用gcc插件插入全局变量声明。例如,如果我有以下代码:测试.c:intmain(void){return0;}我想把它变成:intfake_var;intmain(void){return0;}这可能吗?如果可能,在哪个阶段以及我该怎么做? 最佳答案 我想您会想看一下varpool.c中的varpool_add_new_variable()。您应该能够将使用VAR_DECL类型构建的声明传递给它。同样,看看add_new_static_var(),但我认为前者是您想要的,因为它是专门添加的,以允许在中间/后端声明全

c++ - 用于解释自定义 c++11 属性的 Clang/GCC 插件

我正在尝试为clang或gcc编写一个插件来解释自定义[[cxx11::attributes]]并基于此生成一些代码。从4.5版本开始,gcc支持几乎在每个编译步骤都可以Hook的插件。但是,我认为gcc不太清楚如何修改它的AST并在其中导航(至少我在尝试时遇到了麻烦......)。然后我想起clang被设计成可以扩展并用作库,于是我试了一下。在四处挖掘之后,我发现一些主题说clang不支持自定义属性。我哭了。我的主要目标是根据用户可以在代码中使用的任何类型的注释生成代码。我想使用c++11属性,因为它们非常清晰。Pragma也是一种选择,但它们有一些限制。问题如下:1)是否真的(目前

c++ - gcc 中变量模板的错误显式模板特化

//i.htemplateexternintconsti;//i.cpp#include"i.h"templateexternintconstexpri=42;//main.cpp#include"i.h"intmain(){returni;}在C++14/17模式下,这会用clang返回42,但是gcc会出错:“显式模板特化不能有存储类”。这是gcc中的错误吗? 最佳答案 整个问题有一个相当简单的解决方案。请另外查看this在ISOC++标准-讨论论坛上发帖以及RichardSmith的回复。1.extern不得在显式特化中指定所

c++ - is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false

以前,在AppleLLVM9.1.0中,128位结构上的is_lock_free()已返回true。为了获得完整的std::optional支持,我随后升级到MacPortsgcc7.3。在我第一次尝试编译时,我遇到了这个臭名昭著的showstopper链接器错误:Undefinedsymbolsforarchitecturex86_64:"___atomic_compare_exchange_16",referencedfrom:我知道我可能需要添加-latomic。使用AppleLLVM9.1.0,我不需要它,对此我有一种非常糟糕的预感。如果它是无锁的,你通常不需要链接到任何额外的

c++ - std::packaged_task 编译错误 w/gcc 4.6

我正在尝试使用std::packaged_task在线程中启动函数Queryquery;/*protobufobject*//*fillQueryobject*/std::packaged_tasktask([](Query&q)->SearchResults{index::core::Mergermerger;returnmerger.search(q);});std::futureftr=task.get_future();std::thread(std::move(task),query).detach();Edit2:再次更新代码以修复错误并包含完整的错误消息。g++-4.6(

c++ - gcc 与 visual studio 宏扩展

给定以下代码:voiddoSomething(intone,inttwo,intthree){//somethinghere}#defineONE1,2,3#defineTWO(arg)doSomething(arg);#defineTHREE(arg)TWO(arg)voiddoSomethingElse(){TWO(ONE)THREE(ONE)}visualstudio2010具有以下预处理器输出(省略一些空行):voiddoSomething(intone,inttwo,intthree){}voiddoSomethingElse(){doSomething(1,2,3);doS

c++ - 模板推导在 GCC 4.6 和 4.7 上的两个不同结果

考虑以下代码:#include#include#include#include//VersionAtemplatevoidf(constT&x){std::coutclassT>voidf(constT&x){std::coutclassT,TN...N>voidf(constT&x){std::cout());f(std::array());return0;}Windows上的GCC4.6.2提供:VersionAVersionBVersionCLinux上的GCC4.7.1提供:VersionAVersionBVersionA所以问题是:为什么?这是错误还是未定义的行为?我应该将其

c++ - 使用 gcc 编译更大的(~6MB)映射初始化 C++ 文件

我正在尝试编译一个大约5.7MB的C++文件。我正在64位Linux系统上构建64位Linux可执行文件。不幸的是,g++4.7.2不合作:g++:internalcompilererror:Killed(programcc1plus)通过top观察表明进程在此之前达到了大约2.2GB的内存。我尝试设置--paramgcc-min-expand=0并尝试使用--paramgcc-min-heapsize但这并没有解决问题。使用-O0禁用优化也无济于事。我也试过用clang编译,但结果是相似的。它在超过2GB的内存后发生了段错误。我没有尝试使用clang的任何额外选项,因为我对它不太熟悉