草庐IT

c++ - 处理 gcc 的 noexcept 类型警告

考虑这个例子,来自bug80985:templatevoidcall(Funcf){f();}voidfunc()noexcept{}intmain(){call(func);}在启用所有警告的情况下编译它,就像你做的那样,产生:$g++-std=c++14-Wallfoo.cxxfoo.cxx:2:6:warning:manglednamefor‘voidcall(Func)[withFunc=void(*)()noexcept]’willchangeinC++17becausetheexceptionspecificationispartofafunctiontype[-Wnoex

c++ - GCC 从 c++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?

我有以下c++代码intfactorial(intn){if(n==0){return1;}returnn*factorial(n-1);}intmain(void){factorial(5);return0;}当我使用g++-Sfactorial.cpp创建程序集文件时,我得到以下信息:.file"tail_call_opt.cpp".text.globl_Z9factoriali.type_Z9factoriali,@function_Z9factoriali:.LFB0:.cfi_startproc.cfi_personality0x0,__gxx_personality_v0p

c++ - gcc 和 clang 在运算符重载解析期间隐式实例化模板参数

考虑这段代码:structA;//incompletetypetemplatestructD{Td;};templatestructB{int*p=nullptr;};intmain(){B>u,v;u=v;//doesn'tcompile;complainthatD::dhasincompletetypeu.operator=(v);//compiles}Demo.从u.operator=(v)编译但u=v;不是,在后一个表达式的重载解析期间,编译器必须隐式实例化D-但我不明白为什么需要实例化。为了让事情更有趣,这段代码编译:structA;//incompletetypetempl

c++ - gcc-4.9 未定义行为清理器

在gcc-4.9changes它说:UndefinedBehaviorSanitizer(ubsan),afastundefinedbehaviordetector,hasbeenaddedandcanbeenabledvia-fsanitize=undefined.Variouscomputationswillbeinstrumentedtodetectundefinedbehavioratruntime.UndefinedBehaviorSanitizeriscurrentlyavailablefortheCandC++languages.我查看了这个问题(AC++implemen

c++ - GCC 对 C++17 的支持情况如何?

Clang有一个nicepage描述项目状态w.r.t.C++1z/C++17特性支持(和C++11和C++14是同一页)。g++有apageregardingC++14features,但我找不到任何关于C++17/C++1z的信息。是否正在处理但只是没有出现在网络上?对于5.0版? 最佳答案 截至今天,gcc对C++1z语言的支持跟踪在:https://gcc.gnu.org/projects/cxx1z.html.关于libstdc++的C++1z状态,见https://gcc.gnu.org/onlinedocs/libst

c++ - GCC 和 Clang 模板调用解析差异

给定以下代码:#includestructAlice{templatevoidoperator|(constA&/*a*/)const{std::coutvoidoperator|(constA&/*a*/,constAlice&/*alice*/){std::cout使用GCC4.8.1、4.9和clang3.4编译时不会发出警告,但会给出不同的结果。$g++-Wall-Wextra-std=c++11alice.cpp&&./a.outoperator|non-member$clang++-Wall-Wextra-std=c++11alice.cpp&&./a.outoperato

c++ - 为什么 gcc 和 clang 都会为这个程序产生不同的输出? (转换运算符与构造函数)

程序:#includestructbar_t{intvalue;templatebar_t(constT&t):value{t}{}//edit:Youcanuncommenttheseifyourcompilersupports//guaranteedcopyelision(c++17).Eitherway,it//doesn'taffecttheoutput.//bar_t()=delete;//bar_t(bar_t&&)=delete;//bar_t(constbar_t&)=delete;//bar_t&operator=(bar_t&&)=delete;//bar_t&op

c++ - 使用 -g gcc 标志编译的程序是否比不使用 -g 编译的同一程序慢?

我正在使用-O3来编译程序以提高性能,使用-g来调试符号(如果发生崩溃,我可以使用核心转储)。一件事让我很困扰,-g选项会导致性能下降吗?当我查看带和不带-g的编译输出时,我发现不带-g的输出比带-g的编译输出小80%。如果额外的空间用于调试符号,我不关心它(我猜),因为这部分在运行时不使用。但是,如果对于没有-g的编译输出中的每条指令,我需要在使用-g的编译输出中多执行4条指令,而不是我当然更愿意停止使用-g选项,即使以无法处理核心转储为代价。如何知道程序中调试符号部分的大小,通常使用-g编译会创建一个运行速度比不使用-g编译的相同代码慢的程序? 最佳答案

c++ - 使用 gcc 链接 Fortran 和 C++ 二进制文件

我可以使用gcc在C和C++之间或C和Fortran之间分别使用g++或gfortran进行调用。但是,如果我尝试在C++和Fortran之间进行过程调用,我会在使用g++或gfortran进行编译时出错,因为它们都不知道对方需要的库。如何链接使用C++和Fortran编写的源代码的项目?$catprint_hi.f90subroutineprint_hi()bind(C)implicitnonewrite(*,*)"HellofromFortran."endsubroutineprint_hi$catmain.cpp#includeextern"C"voidprint_hi(void

c++ - 强制 GCC 将 .cpp 文件编译为 C

我有一个外部提供的.cpp文件。它是C兼容代码和一点C++的混合体。C++代码只是C的包装,以利用C++的特性。它使用#ifdef__cplusplus宏来保护C++代码,这很棒。不幸的是,如果我尝试使用GCC进行编译,由于文件结尾,它会将其视为C++。我知道gcc和g++之间的区别-我不想编译为C++。有什么方法可以强制GCC将此文件视为C文件?我试过使用例如--std=c99,但这会正确产生C99对C++无效的错误。将文件重命名为.c是可行的,但我希望尽可能避免这种情况,因为它是由外部提供的,最好保留原始拷贝。 最佳答案 gcc