草庐IT

c++ - 如何在 gcc 中声明和定义一个纯函数?

GCC具有pure和const属性,其中const实际上用于真正的纯函数(pure用于idempotentfunctionswhicharealsoside-effectfree)。那么如何使用常量属性声明和定义函数呢?编辑:我对真正的纯函数感兴趣,那些用const属性声明的函数,而不是那些用pure属性声明的函数。 最佳答案 例子://Declaration:intsquare(intx)__attribute__((const));//Definition:int__attribute__((const))square(intx

c++ - 为什么 gcc 会在全局命名空间中隐藏重载函数?

voidf(){}namespacetest{voidf(int){}voidg(){f();}//erroringcc6.2.0}intmain(){test::g();}用g++-std=c++1zmain.cpp编译,输出如下:main.cpp:Infunction'voidtest::g()':main.cpp:9:4:error:toofewargumentstofunction'voidtest::f(int)'f();//erroringcc^main.cpp:5:6:note:declaredherevoidf(int){}我的编译器是gcc6.2.0。为什么gcc会在

c++ - gcc 在这个概念定义中错误地评估了 std::declval 吗?

在这个概念定义中:#includetemplateconceptInvokable=requires(Funcf){{f(std::declval()...)}->Ret;};像这样实例化时:static_assert(Invokable);gcc-9.0.1(主干)转储(好吧,准确地说是标准库实现):$g++-O2-std=c++2a-fconcepts-Wall-Wextra-Werror-ctu1.cpperror:staticassertionfailed:declval()mustnotbeused!2204|static_assert(__declval_protector

c++ - avr-gcc:(看似)简单功能中不需要的序言/结尾

当尝试处理uint64中的单个字节时,AVRgcc⁽¹⁾给我一个奇怪的序言/结尾,而使用uint32_t编写的相同函数给了我一个单个ret(示例函数是NOP)。为什么gcc这样做?我该如何删除它?Youcanseethecodehere,inCompilerExplorer.⁽¹⁾来自Arduino1.8.9发行版的gcc5.4.0,参数=-O3-std=c++11。源代码:#includeuint32_tf_u32(uint32_tx){uniony{uint8_tp[4];uint32_tw;};returny{.p={y{.w=x}.p[0],y{.w=x}.p[1],y{.w=

c++ - 如果删除一个对象,究竟会发生什么? (gcc)(当双删除崩溃时?)

请注意,我不想用我的问题解决任何问题-我在考虑事情发生的概率,因此想知道一些事情:如果删除对象并使用gcc作为编译器,究竟会发生什么?上周我正在调查一次崩溃,其中竞争条件导致对象被双重删除。崩溃发生在调用对象的虚析构函数时,因为指向虚函数表的指针已经被覆盖。第一次delete是否覆盖了虚函数指针?如果不是,那么第二次删除是否安全,只要在此期间没有分配新的内存?我想知道为什么以前没有识别出我遇到的问题,唯一的解释是在第一次删除期间虚函数表被立即覆盖,或者第二次删除没有崩溃。(第一个意味着如果发生“竞争”,崩溃总是发生在相同的位置-第二个,当竞争发生时通常什么也不会发生-只有当第三个线程覆

c++ - clang 3.3 和 GCC 4.7 const v 的 constexpr

我刚刚尝试在Ubuntu13.04上使用带有GCC4.7.3标准库头文件的clang3.3编译大量代码。这一切都很顺利,除了一个问题。这段代码已经在这台机器上用标准的Ubuntuclang3.2包编译,所以我假设这是clang3.3编译器的一些变化。与使用复杂header的const和constexpr有关的问题。特别是复杂类型具有以下代码块#ifdef__GXX_EXPERIMENTAL_CXX0X__//_GLIBCXX_RESOLVE_LIB_DEFECTS//DR387.std::complexover-encapsulated.constexprdoublereal(){re

c++ - 使用 GCC 或/和 IAR 编译时如何禁用 double 学?

我的嵌入式C代码在具有单精度FPU的CortexM4F上运行。我担心编译器多久将基于软件的double学放在诸如**float_var1=3.0*int_var/float_var_2;(3.0insteadof3.0f)**我担心我会错过其中一些双常数。我怎样才能找到所有出现的较慢的double学?使用sourceryGCC或IAR禁用double或生成错误/警告即可。请指导我实现目标的正确方法。 最佳答案 HowcanIlocatealloccurrencesofslowerdouble-precisionmath?Disabl

c++ - 使用折叠表达式将参数包扩展到 lambda - gcc vs clang

考虑以下代码片段:templatevoidpost(TF){}templatestructfuncs:TFs...{funcs(TFs...fs):TFs{fs}...{}voidcall(){(post([&]{static_cast(*this)();}),...);}};clang++3.8+successfullycompilesthecode.g++7.0failstocompile出现以下错误:prog.cc:Inlambdafunction:prog.cc:10:43:error:parameterpacksnotexpandedwith'...':(post([&]{s

c++ - gcc-8 -Wstringop-truncation 什么是好的做法?

GCC8添加了一个-Wstringop-truncation警告。来自https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82944:The-Wstringop-truncationwarningaddedinGCC8.0viar254630forbug81117isspecificallyintendedtohighlightlikelyunintendedusesofthestrncpyfunctionthattruncatetheterminatingNULcharcterfromthesourcestring.Anexampleofsuch

c++ - gcc:警告:大整数隐式截断为无符号类型

#includeintmain(){unsignedcharc;c=300;printf("%d",c);return0;}输出是可预测的还是未定义的? 最佳答案 很抱歉第一个回答,这里是C++标准的解释:)Istheoutputinanywaypredictableoritsundefined??这是可以预见的。这段代码有两点需要注意:一、unsignedchar类型不能赋值:unsignedcharc;c=300;3.9.1Fundamentaltypes(Page54)Unsignedintegers,declaredunsi