草庐IT

c++ - 如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)

假设您有以下简单的main.cpp文件:#include#include#includeusingnamespacestd;intmain(){conststringFILENAME="foo.txt";ifstreamsomefile(FILENAME);populations.close();return0;}这可以通过VisualStudioC++2010正常编译。但是,在基于Linux的系统上,如果我执行makemain并编译,我们会得到一个预期的错误,因为我们没有调用c_str()字符串常量,像这样:ifstreamsomefile(FILENAME.c_str());众所周

c++ - GCC: "__unused__"与变量属性中的 "unused"

根据GCC'sowndocumentationonvariableattributes,声明未使用属性的正确语法是__attribute__((unused))。但是,在许多示例和其他在线代码中,我经常看到__attribute__((__unused__)),它们似乎都有效。在这两种情况下,是否有指定或省略__的原因?它有什么区别吗,是否有首选版本?是否存在使用其中一种而不使用另一种可能会导致问题的情况?想必这同样适用于其他属性参数吗? 最佳答案 在theverypageyoulinked的顶部,它告诉你:Youmayalsosp

c++ - AFAIK,下面的代码不应该编译,但它在 clang 和 GCC 中编译。我在这里错过了什么?

下面的代码显示了一个带有非平凡默认构造函数的类union类(成员y是用brace-or-equal-initializer初始化的),所以如果默认了此类类的默认构造函数,则应根据§12.1/5第一个要点将其删除。也就是说,声明Tt;不应编译,因为unionT没有默认构造函数。但是codecompilesandexecutes在clang和GCC中。#includeunionT{inty{1};floatx;charc;T()=default;};intmain(){Tt;std::cout编辑我上面的问题从一开始就错了,因为unionT不是类union类。我刚刚了解到C++11中的§9

c++ - Clang 与 gcc std::crbegin with boost::iterator_range

使用libc++的Clang3.8.1编译以下程序:#include#include#include#include#includeintmain(){conststd::vectorv{1,2,3};constautorange=boost::make_iterator_range(v);std::copy(std::crbegin(range),std::crend(range),std::ostream_iterator{std::cout,""});std::cout但是带有libstdc++的gcc6.1.0没有。gcc错误的第一行是:error:nomatchingfunc

c++ - 正在阅读一个不是最近用 GCC 编写的未定义行为的成员吗?

C++reference有以下用于union的explanation,这个问题的有趣部分以粗体显示:Theunionisonlyasbigasnecessarytoholditslargestdatamember.Theotherdatamembersareallocatedinthesamebytesaspartofthatlargestmember.Thedetailsofthatallocationareimplementation-defined,andit'sundefinedbehaviortoreadfromthememberoftheunionthatwasn'tmos

c++ - gcc 预编译 header 的奇怪行为

我在让预编译的头文件工作时遇到了麻烦,所以我想到了以下最小工作示例。这是头文件foo.h#includeusingnamespacestd;voidhello(){cout我将它编译为g++-cfoo.h给我一个编译后的头文件foo.gch。我希望当我编译以下包含foo.h的源文件时,它应该选择headerfoo.h.gch并且我很好。//test.cpp#include//Swaporderinglater#include"foo.h"//------------------intmain(){hello();}但令人惊讶的是,这并没有使用foo.h.gch进行编译,而是使用了foo

c++ - 关于 C++ 编译器的几个问题 : GCC, MSVC、Clang、Comeau 等

我有几个关于C++编译器的问题C++编译器是否需要one-passcompiler?标准是否在任何地方谈论它?特别是GCC是一次性编译器吗?如果是,那么为什么它会在thisexample中生成以下错误两次(尽管每个错误消息中的模板参数都不同)?error:declarationof‘adderitem’shadowsaparametererror:declarationof‘adderitem’shadowsaparameter一个更一般的问题one-passcompiler的优点和缺点是什么?和multi-passcompiler?有用的链接:AListofC/C++compiler

c++ - gcc -lpthread 不工作

我的系统中安装了ubuntu11。我有一个使用pthread库的c程序。我收到错误Undefinedreferencetosem_wait()即使我使用标志-lpthread编译。例如:gcc-lpthreadprog.c该程序在其他ubuntu安装上运行良好。 最佳答案 尝试:gcc-pthread而不是-lpthread。我相信,差异是显着的。后者链接到libpthread,前者链接到libpthread和其他一些东西!sem_wait是librt的一部分,因此您也可以使用gcc-lrt,但是-pthread会为您完成此操作(并

c++ - 如何修复 gcc -Wall "embedded '\0' in format"警告

这可能不是很重要,但我正在尝试修复g++提示的所有警告。在下面的代码中,我收到了snprintf()行的“embedded'\0'informat”警告。我该如何解决这个问题?intfilePathSize=path.size()+s.size()+1;charfilePath[filePathSize];snprintf(filePath,filePathSize,"%s%s\0",path.c_str(),s.c_str());提前致谢... 最佳答案 警告是有充分理由的:snprintf将认为\0标记字符串的结尾。如果您确实需

c++ - gcc编译C++代码: undefined reference to `operator new[](unsigned long long)'

有一段C++代码:#includeintmain(){intb=sizeof('a');if(b==4)printf("I'maCprogram!\n");elseprintf("I'maC++program!\n");}像这样编译:gccmain.cpp-omain它成功并给出:I'maC++program!然后在函数main的某处添加一行int*p1=newint[1000];它失败了:C:\Users\...\AppData\Local\Temp\cccJZ8kN.o:main1.cpp:(.text+0x1f):undefinedreferencetooperatornew[]