草庐IT

c++ - MSVC 如何优化静态变量的使用?

我对MicrosoftVisualC++编译器如何处理/优化静态变量感兴趣。我的代码:#includevoidno_static_initialization(){staticintvalue=3;}voidstatic_initialization(intnew_value){staticintvalue=new_value;}intmain(){no_static_initialization();static_initialization(1);static_initialization(std::rand());return0;}这是代码的程序集(经过优化编译):我的主要兴趣领

c++ - MSVC 中的 "interface"关键字是什么?

我正在查看Windows8.1SDK,在UnknownBase.h中看到类似typedefinterfaceIUnknownIUnknown;我以前从未见过这个interface关键字。请注意,这绝对是一个.hheader,由cl.exe处理。不是IDL文件,也不是midl.exe处理的。我在网上找到了这个:http://msdn.microsoft.com/en-us/library/50h7kwtb.aspx但是__interface和interface是不一样的有人能帮我介绍一下吗? 最佳答案 Microsoft有一些特定于编

c++ - 如何在 MSVC 中使用使用 MingW 编译的库?

我已经用MingW/MSYS编译了几个库...生成的静态库总是.a文件。当我尝试将库与MSVC项目链接时,VisualStudio会抛出“未解析的外部符号”......这意味着.a静态库与MSC++链接器不兼容。我认为它必须转换为与MSVC兼容的.lib文件。.a和.lib都只是.o或.obj文件的AR存档,那么有什么方法可以在MSVC项目中使用MingW编译的库?还是我必须在一个编译器/链接器中编译/链接所有内容-仅限MSVC/仅限MingW?据说MingW编译器与MSVC兼容。我阅读了一些关于这个主题的帖子,但他们大多说将文件重命名为.lib应该可以完成工作,但不幸的是它对我不起作

c++ - 为什么空基类优化 (EBO) 在 MSVC 中不起作用?

为什么空基类优化(EBO)没有在VisualC++中得到充分应用?如果我有很多基类,有什么方法可以帮助编译器进行这种优化?#includestructT1{};structT2{};structT3{};structT4{};structT5{};structT6{};structTest:T1,T2,T3,T4,T5,T6{};intmain(){std::cout 最佳答案 这是VisualC++编译器中长期存在的错误。当一个类派生自多个空基类时,只有初始的空基类会使用空基优化(EBO)进行优化。2006年在MicrosoftC

c++ - 将 bool 和 int 的引用与 MSVC 2015 进行比较时发出警告

以下代码使用MSVC(2015更新3)生成警告-使用/W4:constbool&a=true;constint&b=1;if(a==b)C4805:“==”:“constbool”类型和“constint”类型在操作中的不安全混合但没有引用它可以干净地编译。constboola=true;constintb=1;if(a==b)为什么?编辑:也只是在没有const的情况下测试过boola=true;intb=1;if(a==b)警告再次出现...编辑2:在Debug中编译...我确实不得不在constnoref情况下使C4127:conditionalexpressionisconst

c++ - 为什么 MSVC 会优化掉这个 memcpy 调用?

我有以下C代码(我将其缩短了一些其他调用和检查):#include#includeexterncharbuffer[];externvoidgetstr1(char*buff,intbuflen);externvoidgetstr2(char**s);externvoiddosomething(char*s);voidmyfn(){char*s,*s1;intlen;getstr1(buffer,128);getstr2(&s);len=*s+*buffer;memcpy(buffer+*buffer+1,s+1,(*s)*sizeof(char));*buffer=len;dosom

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