草庐IT

c++ - 与 gcc 相比,comeau 编译器值得吗?

到目前为止,我一直在使用gcc、g++进行C、C++应用程序开发,并且发现它非常棒。但是浏览StackOverflow我发现许多成员表示Comeau编译器中的错误报告比任何其他编译器都多。这是真的?我没有投资编译器的任何商业版本。当gcc、g++可以解决问题时,花钱购买C/C++编译器的商业版本真的值得吗? 最佳答案 我编写C++的经验是,使用多个编译器编译代码是发现代码中奇怪的极端情况的好方法。在我们的例子中,我们使用了gcc、Applegcc和VisualStudio编译器cl(免费)。在Windows上,我更喜欢cl编译器,因

c++ - 如何知道(在 GCC 中)何时声明了给定的宏/预处理器符号?

假设我在各种头文件中有#definefoo。它可能会扩展到一些不同的事物。我想知道(在编译.cc文件时)遇到#define时,它​​将扩展到什么,它是哪个文件以及它从何处包含。这可能吗?如果没有,是否有任何可能有帮助的部分解决方案?请随时添加带有澄清请求的评论。编辑:当前的答案似乎集中在有#define的情况下,我只想跳转到定义或知道定义是什么。这是简单的情况,是的,您的解决方案有效。但是当我在不同的文件中有相同的#define,并且想知道先启动哪个时,这些技术都没有用。好吧,我其实很小心地使用#warning找到了正确的地方。但这需要很多工作。 最佳答案

c++ - 什么时候为 gcc 使用 -O2 标志?

如果我使用“-O2”标志,性能会提高,但编译时间会变长。我如何决定是否使用它?也许O2在某些特定类型的代码(例如数学计算?)中发挥最大作用,我应该只将它用于项目的那些部分吗?编辑:我想强调的是,为项目的所有组件设置-O2会将总编译时间从10分钟更改为30分钟。 最佳答案 我建议大多数时候使用-O2,好处包括:通常会减少生成代码的大小(与-O3不同)。更多警告(一些警告需要仅在优化期间进行的分析)通常可以显着提高性能(这可能无关紧要)。如果发布级代码将启用优化,最好在整个开发/测试周期都启用优化。启用优化后,源代码级调试会更加困难,偶

c++ - gcc 的 -Wconversion 是否与使用比 int 短的整数类型的复合赋值(+= 等)不兼容?

gcc有一个有用的标志-Wconversion当存在从较宽类型到较窄类型的隐式转换时会产生警告,可能会丢失信息。不幸的是,它有以下......无用的......行为。考虑这个程序:intmain(void){shortx=1;x=x+x;return0;}用-Wconversion编译产生nonsense.c:Infunction'main':nonsense.c:3:8:warning:conversionto'shortint'from'int'mayalteritsvalue[-Wconversion]这很公平;在大多数平台上,如果发生x==0x8000,这将执行您可能意想不到的

c++ - GCC 4.9 中的模板实例化错误,在 GCC 4.8 中工作正常

下面的测试代码在GCC4.8(和4.7)下工作得很好:#includetemplatestructFunctor{templatestructInner{floatoperator()()const{return(object.*function)(args...);}};};classObject{public:floatsomeFunction(){return{};}floatsomeFunctionWithArgument(int){return{};}};Objectobject;Functor::templateInnerfunctor1;Functor::template

c++ - 使用 GCC 链接具有重复类名的库

在链接包含同名类的库时,GCC是否有办法发出警告?例如Port.hclassPort{public:std::stringme();};Port.cpp#include"Port.h"std::stringPort::me(){return"Port";}FakePort.hclassPort{public:std::stringme();};FakePort.cpp#include"FakePort.h"std::stringPort::me(){return"FakePort";}main.cpp#include"Port.h"intmain(){Portport;std::cou

c++ - 从 GCC 原子操作构建的轻量级自旋锁?

我想在我的项目中尽量减少同步并尽可能编写无锁代码。当绝对必要时,我喜欢用原子操作构建的轻量级自旋锁代替pthread和win32互斥锁。我的理解是,这些是底层的系统调用,可能会导致上下文切换(对于非常快速的关键部分来说,这可能是不必要的,在这些部分中,简单地旋转几次会更可取)。我所指的原子操作在此处有详细记录:http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Atomic-Builtins.html这里有一个例子来说明我在说什么。想象一个可能有多个读者和作者的RB树。RBTree::exists()是只读的并且是线程安全的,RBTree::inse

c++ - 当 `new v < new v` 不是模板时,为什么 gcc 拒绝 `v`?

简单的测试用例:#includestructv{};intmain(){std::cout我知道比较指针有一个未指定的结果,但这与这里无关(并且可以通过更多的击键产生类似的例子,如后面的coliru片段)。我手边的C++标准在§14.2第3段中说:Afternamelookupfindsthatanameisatemplate-nameorthatanoperator-function-idoraliteral-operator-idreferstoasetofoverloadedfunctionsanymemberofwhichisafunctiontemplate,ifthisis

android - C++11 cmath 函数不在带有 gcc-4.8 或 clang 3.4 的 android NDK 的 std 命名空间中

在C++11之后,各种cmath以前在全局命名空间中的函数被移动到std命名空间,当包含时标题。然而,AndroidNDK构建在gcc-4.8和clang-3.4工具链方面存在问题。C++11标志已正确指定,因为其他c++11细节如unique_ptr工作正常。如果我尝试使用std::round,或std::cbrt,编译器说这些不存在于std::中命名空间,他们应该[1]。它们存在于全局命名空间中,但我不想使用它们。这是一个已知问题吗?我忽略了什么吗?有解决方法吗?[1]http://en.cppreference.com/w/cpp/header/cmath使用gcc-4.8.1的

c++ - lambda : GCC bug and/or Clang bug? 中捕获变量的 decltype()

我检查了GCCbuglist和Clangbuglist并且还没有看到任何相关内容。ThisWandboxlink显示一些C++11/C++14代码为各种类型的x执行decltype(x)和decltype((x))被lambda捕获。GCC和Clang对这段代码给出了不同的答案。如果有的话,哪一个是正确的?这是有问题的片段://insidemain()inti=42;int&j=i;[j=j](){static_assert(std::is_same::value,"");//Astatic_assert(std::is_same::value,"");//B}();[=](){sta