草庐IT

c++ - 为什么 GCC 会破坏调用带有短参数的 abs 函数的代码?

#include#includeintmain(){shortintk=11;switch(std::abs(k)){case44:return5;break;}}以上代码在GCC4.4.7和7.1及更高版本中运行良好。它在GCC4.5.4和更高版本中给出错误::Infunction'intmain()'::7:23:error:switchquantitynotaninteger所以我的问题是为什么要在GCC中引入这个重大变化?或者,实现者是否不知道这是一个重大变化?如果是这样,为什么会这样,他们如何测试他们不会破坏现有代码?这个问题也可以针对Clang,因为它与abs函数有类似的问

c++ - 模板模板参数在 Clang 但不是 GCC 下导致编译器错误

这个问题在这里已经有了答案:Templatetemplateparameteranddefaultvalues[duplicate](1个回答)关闭4年前。同时帮助解决toomanytemplateparametersintemplatetemplateargument中提到的问题我脑子里出现了一个问题:在这种情况下,哪个编译器是正确的编译:templateclassOp>classFunction{};template::value||std::is_floating_point::value>structOperator;templatestructOperator{};templ

c++ - GCC 似乎错过了简单的优化

我正在尝试引入一个具有三元运算符语义的通用函数:E1?E2:E3。我看到编译器能够根据三元运算符的E1条件消除E2或E3之一的计算。然而,GCC在ternary函数调用的情况下错过了这种优化(即使E2/E3没有副作用)。在下面的列表中,函数ternary的行为类似于三元运算符。然而,GCC可能会发出对函数f的潜在大量调用,这似乎可以消除某些输入值(对于三元运算符来说正是这样做的),因为f是用纯属性声明的-请查看GCC生成的汇编代码的godbolt链接。它是否可以在GCC中进行改进(优化空间)或C++标准是否明确禁止此类优化?//Veryheavyfunctionintf()__attr

【ARM 嵌入式 编译系列 2.4 -- 编译参数-Wl,--gc-sections | -wsuggest-attribute=pure | -wreal-q-constant |】

请阅读【嵌入式开发学习必备专栏之ARMGCC编译专栏】文章目录概述编译参数详细介绍-Wl选项例子:--gc-sections``--gc-sections例子:-Wshadow例子:-Wlogical-op例子:-Waggregate-return例子:-Wfloat-equal例子:-Wconversion例子:-Wpointer-arith例子:概述在使用GCC(GNUCompilerCollection)进行编译时,可以通过不同的编译参数(标志)来控制编译行为、优化级别、警告输出等。以下是您列出的一些GCC编译参数的介绍:编译参数详细介绍参数作用–all-warnings与-Wall相同

About the ARM PrimeCell GPIO

ThePrimeCellGPIOisanAdvancedMicrocontrollerBusArchitecture(AMBA)compliantSystem-on-Chip(SoC)peripheralthatisdeveloped,tested,andlicensedbyARM.ThePrimeCellGPIOisanAMBAslavemodulethatconnectstotheAdvancedPeripheralBus(APB).ThePrimeCellGPIOprovideseightprogrammableinputsoroutputsthatyoucancontrolintwom

c++ - 将指针转换为模板参数 : Comeau & MSVC compile, GCC 失败

考虑以下代码:templateclassbase{};intmain(){basetest;return0;}Comeau和MSVC都可以毫无问题地编译它(除了Comeau警告未使用的变量),而GCC在basetest;上失败行,说明Infunction`intmain()':acaststoatypeotherthananintegralorenumerationtypecannotappearinaconstant-expressiontemplateargument1isinvalid它到底在提示什么?谁是对的——这段代码应该编译吗?值得注意的是,我的GCC版本非常旧(3.4.2

c++ - 我可以解开 GCC 的 RTTI 名称吗?

使用gcc,当我使用typeid请求对象/变量的类型时,我从type_info::name方法得到的结果与我期望在Windows上得到的结果不同。我用Google搜索了一下,发现RTTI名称是特定于实现的。问题是,我想获得一个类型的名称,因为它会在Windows上返回。有没有简单的方法可以做到这一点? 最佳答案 如果这正是您要问的,那么对于type_info::name()返回的名称,没有编译器开关可以使gcc表现得像msvc。但是,在您的代码中,您可以依赖gcc特定的__cxa_demangle函数。事实上有anansweronS

c++ - GCC 优化在运行时产生 "Undefined symbol"

我现在有一个让我很困惑的问题:我有一段用C++编写的软件,它链接到C中的一个库。我使用通常的方式包含头类extern"C"{#include}只要我不使用gcc的优化,一切都可以正常工作。一旦我什至打开-O1,因此是第一个优化级别,在运行时我从这个库中得到一个符号的“undefinedsymbol”错误。但是,该名称已经过名称修改,由于extern"C",应该将其禁用。调用相关符号的函数是内联的,以防万一。使用的编译器是gcc4.4.3。老实说,我什至不知道要搜索什么,所以如果你们中的任何人能给我一些这种行为的理由,我将不胜感激。感谢您的支持。 最佳答案

在 Mac 上使用 gcc 4.6.1 的 C++11

我是mac的新手,正在尝试让gcc4.6工作。我安装了MacPorts并安装了gcc4.6.1(通过执行sudoportinstallgcc46)。我正在尝试编译一个简单的测试代码,该代码可以在Linux(使用gcc4.6.1和4.6.2)和Windows上正常编译,但我遇到的错误让我觉得安装的库有问题。#include#include#includestructtest{voidget(){}};/*templatetestasync(constFunc&f){f();returntest();}*/usingnamespacestd;intmain(intargc,constcha

C++11 is_pod 与 GCC 4.6

在relaxeddefinitionofPOD下在C++11中,我的理解是以下结构被视为POD:templatestructFoo{Foo(){}explicitFoo(T*obj):m_data(obj){}T*m_data;};但是,使用GCC4.6并使用-std=c++0x标志进行编译,如果我说:std::cout>::value输出:false这是一个ideonelink显示完整的程序。(注意ideone使用的是GCC4.5)那么,我对C++11中POD的理解是错误的,还是GCC4.6在C++11合规性方面根本不是最新的? 最佳答案