草庐IT

c++ - GCC、-O2 和位域——这是错误还是功能?

今天我在试验位域时发现了令人震惊的行为。为了讨论和简单起见,这里有一个示例程序:#includestructNode{inta:16__attribute__((packed));intb:16__attribute__((packed));unsignedintc:27__attribute__((packed));unsignedintd:3__attribute__((packed));unsignedinte:2__attribute__((packed));};intmain(intargc,char*argv[]){Noden;n.a=12345;n.b=-23456;n.

c++ - 链接使用不同版本的 GCC 构建的目标文件

我对使用现代版本的GCC4.4.x/4.5.x构建C++库有一些兼容性问题,其中客户端使用旧版本,比如3.4.x/4.1.x。建议的一种解决方案是编译目标文件并分发这些文件。然后,客户端可以使用任何版本的GCC和相关的ABI进行链接。一些问题:这是正确的吗?我应该静态链接以避免libstdc++兼容性问题吗?这是不必要的吗(我听说gcc3.4以后是向前兼容的)?干杯,格雷姆 最佳答案 最安全的方法是给他们一个.so及其对应的带有稳定二进制API的header。为了保持二进制稳定,API不应接受或返回任何std::类似std::str

c++ - 为什么 GCC 不自动向量化这个循环?

我正在尝试优化占我程序大量计算时间的循环。但是当我使用-O3-ffast-math-ftree-vectorizer-verbose=6打开自动矢量化时,GCC输出它无法对循环进行矢量化。我正在使用GCC4.4.5代码:///Findthepointinthepathwiththelargestvparametervoidprediction::find_knife_edge(constfloat*__restrict__constelevation_path,float*__restrict__constdiff_path,constfloatpath_res,constunsign

c++ - 为什么当枚举或 int 值作为函数的 bool 参数传递时 gcc 不发出警告?

我有以下代码:typedefenum{FOO,BAR,BAZ}foo_t;staticvoidafunc(boolis_it_on){/*dothejob*/}intmain(void){afunc(BAZ);return0;}编译此代码不会生成任何警告消息,即使为编译器提供了-Wall-Wextra选项。我什至尝试过使用-Wconversion选项,但它没有效果,因为bool和enum对于g++似乎具有相同的大小。(据我所知,enum类型的大小未在规范中定义)我已经梳理了gcc手册,但一无所获。问题:有没有办法强制编译器在这种情况下生成警告?或者这种隐式转换是否符合C++规范?我使用

c++ - 带有 decltype : bug in clang or gcc? 的 sfinae

Clang-3.2可以编译并且代码按预期运行:structhave_f{intf(inti){return10;}};structempty{};templatestructouter{Tt;//ifThavef(),defineouter_f()templateintouter_f(inti){returnt.f(i);}};intmain(){outero1;outero2;//tosilenceunusedvarwarningreturno1.outer_f(10)+sizeof(o2);}任何版本的GCC拒绝:t.cc:13:6:error:‘structempty’hasno

c++ - 为什么 GCC 允许从私有(private)嵌套类继承?

考虑以下代码:classA{classB{};};templateclassD:A::B{};voidf(){Dd;}D继承自A::B这是一个私有(private)嵌套类。我原以为这是一个错误,但GCC接受了这个代码。是GCC中的错误还是我遗漏了什么? 最佳答案 我找到了答案。因为它可能对其他人有用,所以我将其发布在这里-这是GCC错误47346. 关于c++-为什么GCC允许从私有(private)嵌套类继承?,我们在StackOverflow上找到一个类似的问题:

c++ - C++名称查找在这里做什么? (& GCC 对吗?)

我在一些生产代码中遇到问题,我将其最小化为以下测试用例:templatevoidintermediate(Tt){func(t);//line4("funcnotdeclaredinthisscope")}namespacens{structtype{};}voidfunc(ns::typeconst&p);//line11("declaredhere,later")voidfoo(ns::typeexit_node){intermediate(exit_node);//line15("requiredfromhere")}GCC4.5可以很好地编译它。使用和不使用-std=c++11

c++ - GCC -m32 标志 :/usr/bin/ld: skipping incompatible

在64位主机上,我尝试使用-m32选项构建共享库。这些库是否可以与常规64位库链接?我正在做这样的事情:g++-m32-sharedsource.cpp-l64_bit_library.so-o32_bit_library.so并得到这样的错误信息:/usr/bin/ld:skippingincompatible64_bit_library.so所以我的问题是:如何在64位主机上编译64_bit_library.so和32_bit_library.so,使32_bit_library.so要链接到64_bit_library.so? 最佳答案

c++ - 尝试使用 tcc 针对 gcc 生成的 .o 文件编译源代码时出现奇怪的行为

我正在尝试使用tcc(版本0.9.26)针对gcc生成的.o文件编译源代码,但它有奇怪的行为。gcc(ver5.3.0)来自MinGW64位。更具体地说,我有以下两个文件(te1.cte2.c)。我在windows7框上执行了以下命令c:\tcc>gcc-cte1.cc:\tcc>objcopy-Oelf64-x86-64te1.o#thisisneededbecausete1.ofrompreviousstepisinCOFFformat,tcconlyunderstandELFformatc:\tcc>tccte2.cte1.oc:\tcc>te2.exe567indummy!!!

c++ - 表达式中运算符的 GCC 和 ADL

考虑这个代码示例templatestructS{Tt;};templatevoidfoo(constS&v){bar(v.t);}namespaceN{structA{};}voidbar(constN::A&a){}intmain(){Sa;foo(a);}代码无法在GCC和Clang中编译,因为常规查找和ADL都无法解析从foo到bar的调用。这是完全符合预期的,因为bar调用的关联namespace列表只是N。不包括全局命名空间,找不到全局bar。一切都应该如此。但是,如果我把它改成templatestructS{Tt;};templatevoidfoo(constS&v){+v