草庐IT

c++ - 值初始化 : MSVC vs clang

#includetemplatestructA{Tm_a[N];A():m_a{}{}};structS{explicitS(inti=4){}};intmain(){Aan;}上面的代码在MSVC(2017)中编译得很好,但在clang3.8.0中编译失败(clang++--version&&clang++-std=c++14-Wall-pedanticmain.cpp):clangversion3.8.0(tags/RELEASE_380/final263969)Target:x86_64-unknown-linux-gnuThreadmodel:posixInstalledDir

c++ - MSVC++ 中的源字符集编码规范,如 gcc "-finput-charset=CharSet"

我想创建一些处理编码的示例程序,特别是我想使用宽字符串,例如:wstringa=L"grüßen";wstringb=L"שלוםעולם!";wstringc=L"中文";因为这些是示例程序。这对于将源代码视为UTF-8编码文本的gcc来说绝对是微不足道的。但是,直接编译在MSVC下不起作用。我知道我可以使用转义序列对它们进行编码,但我更愿意将它们保留为可读文本。是否有任何选项可以指定为“cl”的命令行开关,以便做这个工作?有没有像gcc'c-finput-charset这样的命令行开关?如果不是,您建议如何使文本对用户自然?注意:将BOM添加到UTF-8文件不是一种选择,因为它变得

MSVC x64 中的 C++ 异常 "Skips"Try-Catch 子句

我正在用C++编写程序。该程序在Win32(x86)上运行良好,最近我尝试为x64本地编译它。当然,事情并没有立即奏效。调试问题后,我设法用这个简单的代码片段重现了它:classMyException{};intmain(){try{for(;;){try{std::cout(我将很快解释if(1==0)子句)使用MSVCforx86编译此代码时(我使用的是2010),结果符合预期:ThrowingCatch1ThrowingCatch1ThrowingCatch1ThrowingCatch1...以此类推,无限循环。但是,为x64编译此代码会导致:ThrowingCatch2Done

c++ - MSVC++ : template's static_assert is not triggered inside a lambda

更新2:这已在VS2019Preview16.1Preview1中得到修复。更新:我已在visualstudio.com提交错误报告.所以我开始研究C++的模板,当我试图阻止使用static_assert编译模板类时遇到了这个问题。基本上,static_assert错误在VS2017上使用C++语言标准:ISOC++17标准(/std:c++17)。我也在gcc-7上使用-std=c++17进行了尝试,并触发了错误。这是VS2017上的错误还是我遗漏了什么?代码示例:#include#include#includetemplateclassIntegralContainer{stati

c++ - MSVC : tell the optimizer you clobber memory? 中微基准的优化障碍

ChandlerCarruth在他的CppCon2015talk中介绍了两个函数。可以用来对优化器进行一些细粒度的抑制。它们对于编写优化器不会简单地陷入无意义的微基准非常有用。voidclobber(){asmvolatile("":::"memory");}voidescape(void*p){asmvolatile(""::"g"(p):"memory");}这些使用内联汇编语句来改变优化器的假设。clobber中的汇编语句声明其中的汇编代码可以读写内存中的任何位置。实际的汇编代码是空的,但优化器不会查看它,因为它是asmvolatile。当我们告诉它代码可以在内存中的任何地方读写

c++ - 为什么这个 SFINAE 片段不能在 g++ 中工作,而是在 MSVC 中工作?

在MSVC2017中,这工作正常,两个static_asserts都没有按预期触发:templatestructdo_have_size{template().size())>staticstd::true_typecheck(T);staticstd::false_typecheck(...);usingtype=decltype(check(std::declval()));};intmain(){usingTR=typenamedo_have_size>::type;usingFL=typenamedo_have_size::type;static_assert(std::is_

c++ - MSVC 中的 ODR 错误?

当使用MSVC(VS2015)编译时,此程序打印11而不是12。f1.cpp:#includestaticstd::functionhelper(){structF{intoperator()(){return1;}};returnF();}std::functionf1(){returnhelper();}f2.cpp:#includestaticstd::functionhelper(){structF{intoperator()(){return2;}};returnF();}std::functionf2(){returnhelper();}main.cpp:#include#

c++ - MSVC++ 可变参数宏扩展

所以我有一个在GCC中运行良好的宏,但在Microsoft的C++编译器中却不行。我希望有人可能知道一种解决方法,或者可以向我解释为什么它会这样。我确信这个宏并不完全是“标准的”,但它确实可以帮助我。这是一个宏的功能示例:#defineVA_NARGS_IMPL(_1,_2,_3,_4,_5,N,...)N#defineVA_NARGS(...)VA_NARGS_IMPL(__VA_ARGS__,5,4,3,2,1)#defineFULLY_EXPANDED(count,...)\MAC##count(__VA_ARGS__)#defineSEMI_EXPANDED(count,...

c++ - 使用MSVC 2017编译器在Qt Creator中进行调试

我已经安装了Qt,但是尝试从QtCreator调试C++代码时遇到错误。我正在Windows上使用VisualStudio2017,似乎未安装QtCreator所需的调试器(cdb.exe)。使用MSVC2017编译器时如何配置调试以在QtCreator中使用64位代码? 最佳答案 我在这里讨论的是让QtCreator与VisualStudio2017(MSVC2017)编译器一起使用-包括调试!默认安装的MSVC2017和Qt5.10将允许您编译和运行代码,但是默认情况下您不会获得调试支持。我将显示为以下引用系统安装所有组件(包括

c++ - MSVC 相当于 __attribute__ ((warn_unused_result))?

我发现__attribute__((warn_unused_result))作为一种鼓励开发人员不要忽略函数返回的错误代码的方法非常有用,但我需要它与MSVC以及gcc和gcc兼容的编译器,例如ICC。MicrosoftVisualStudioC/C++编译器是否具有等效机制?(到目前为止,我已经尝试过MSDN,但没有任何运气。) 最佳答案 它是_Check_return_。见here类似注释的例子和here对于功能行为。它自MSVC2012起就受支持。例子:_Check_return_intmy_return_must_be_ch