草庐IT

c++ - gcc nullptr 问题

我正在移植现有代码以在gcc4.7.2下编译,并遇到了一个关于nullptr的奇怪问题。我设法将其归结为一个简单的测试用例:#includeconstchar*g_marker="Originalvalue";voidSetMarker(constchar*s){g_marker=s;}char*Test1(){returnSetMarker("Iwashere1"),nullptr;}char*Test2(){SetMarker("Iwashere2");returnnullptr;}char*Test3(){returnSetMarker("Iwashere3"),(char*)N

c++ - 可以在 gdb 中调用内联函数和/或使用 GCC 发出它们吗?

我们都知道内联函数会使调试变得更加棘手,因为它们可以从堆栈跟踪等中删除。但是假设我想从gdb中调用一个内联函数,并且我知道它的名称和参数。我认为我应该能够做到这一点,但我明白了:Cannotevaluatefunction--maybeinlined我用nm列出了我正在使用的共享库中的符号,发现我要调用的函数不在里面。没什么大惊喜。我想要的是一种生成这些内联函数的可见定义的方法。我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件。也许有某种方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些可以更轻松地在gdb中调用和检查内联函数结果的技巧?我在Lin

c++ - 让 GCC 在 C++11 模式下在 FreeBSD 上工作

如何在FreeBSD10上获得基于GCC的C++11设置?似乎FreeBSD上最近的GCC版本附带的标准库被破坏了。我已经安装了端口gcc49然后尝试编译它:#includeintmain(){autostr=std::to_string(42);str=std::to_string(42ull);str=std::to_string(4.2);str.clear();return0;}这给了我一个错误:g++49-v-std=c++11foo.ccUsingbuilt-inspecs.COLLECT_GCC=g++49COLLECT_LTO_WRAPPER=/usr/local/li

c++ - GCC 是否优化 std::tie 仅用于可读性?

假设我有一个std::tuple:std::tuplet={1,2,3,4};我想使用std::tie只是为了这样的可读性目的:inta,b,c,d;//inrealcontextthesenameswouldbemeaningfulstd::tie(a,b,c,d)=t;对比只使用t.get(0)等GCC会优化这个元组的内存使用还是会为a,b,c,d分配额外的空间?变量? 最佳答案 在这种情况下,我看不出有任何理由不这样做,在as-ifrule下编译器只需要模拟程序的可观察行为。快速实验usinggodbolt:#include#

c++ - gcc、g++、cygwin 和 mingw 之间的关系?

我知道对于我的类(class),我必须安装cygwin才能让我的NetbeansIDE运行,但是我在设置过程中看到了g++和gcc的选项,我不确定它们是否相同,wingw在哪里?它是另一个编译器吗?如果是,为什么选择on而不是另一个? 最佳答案 g++和gcc分别是gnuC++和C编译器。它们实际上是具有不同标志的相同编译器。MinGW是“Windows的极简Gnu”。它是在Windows上运行的gnu编译器的一个端口。Cygwin是gnu编译器(以及各种其他实用程序)到Windows的另一个端口。更准确地说(IMO,无论如何),它

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

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