草庐IT

C++:在 MSVC 中使用 __stdcall 回调 typedef

这个类型定义:typedefDWORDWINAPI(*CM_Open_DevNode_Key)(DWORD,DWORD,DWORD,DWORD,PHKEY,DWORD);在BorlandCpp中编译良好,但是,当我在msvc中编译它时,我必须删除WINAPI(它只是__stdcall的别名):typedefDWORD(*CM_Open_DevNode_Key)(DWORD,DWORD,DWORD,DWORD,PHKEY,DWORD);为什么会这样?我可以安全地删除WINAPI部分吗?更新:我必须从typedef中删除“WINAPI”,否则我会得到errorC2059:syntaxerr

c++ - MSVC 等同于 GCC 的 -fno-finite-math-only?

在GCC上,我们启用-ffast-math来加速浮点计算。但是由于我们依赖于NaN和Inf浮点值的正确行为,我们还打开了-fno-finite-math-only,以便假设值不是NaN/Inf的优化对于MSVC,-ffast-math的“等价物”显然是/fp:fast。但是,与GCC的-ffast-math一样,它alsoincludes假设Nan/Inf不存在的优化。(至关重要的是,不能保证像std::isnan()这样的测试会给出“准确”的结果。)是否有一个MSVCC++编译选项允许您利用大部分/fp:fast优化,但仍“正确”处理NaN和Inf值?(或者至少,保证像std::is

c++ - 具有枚举规范的模板模板类在 MSVC++ 编译器 : C3201 上失败

代码这是SSCCE我的问题示例://MyLibrary,whichIwanttotakeintheuser'senumandatemplateclasswhichtheyputper-enumspecializedcodetemplateclassEnumStruct>structLibraryT{/*Librarystuff*/};//UserDefinedEnumandAssociatedTemplate(whichgetsspecializedlater)namespaceMyEnum{enumEnum{Value1/*,...*/};};templatestructMyEnum

c++ - 如何正确重写 ASSERT 代码以在 msvc 中传递/分析?

VisualStudio为C/C++添加了代码分析(/analyze)以帮助识别错误代码。这是一个非常好的功能,但是当您处理旧项目时,您可能会被警告的数量弄得不知所措。大多数问题的产生是因为旧代码在方法或函数的开头执行一些断言。我认为这是代码中使用的ASSERT定义(来自afx.h)#defineASSERT(f)DEBUG_ONLY((void)((f)||!::AfxAssertFailedLine(THIS_FILE,__LINE__)||(AfxDebugBreak(),0)))示例代码:ASSERT(pBytes!=NULL);*pBytes=0;//我正在寻找一种简单、干净

c++ - 禁用 MSVC 警告 C4482 是否安全?

虽然用枚举名称限定枚举值在C++03中是无效的,但据我所知,它在C++11中是有效的。尽管如此,MSVC10仍会针对以下内容生成警告C4482:enumE{A,B};inti=E::A;//warningC4482(butvalidC++11?)由于我们的大部分代码都使用了C++11功能(尤其是lambda),因此禁用此警告似乎是安全的。我认为该代码是有效的C++11对吗?注意:我没有编写有问题的代码,我宁愿不经历并更改每一次出现的代码。编辑:添加了一些相关链接。MSDNpageforthewarning.Anotherquestionaboutthewarning.问题和答案似乎都引

c++ - 在 MSVC 上解决类似 Sanitizer 的功能

来自Linux/gcc/clang,我发现自己越来越多地在Windows/VisualStudio上工作。我真正缺少的是地址清理器(边界检查、泄漏、释放后使用……)。我做了一些研究,也尝试了一些事情,但还没有找到一个完整(功能方面)且可靠的替代品。例如,我尝试过Dr.Memory,但了解到它不适用于基于Qt的程序(至少不适用于Windows10)。那么我如何在Windows/MSVC上获得类似地址清理器的功能? 最佳答案 至少clang的ASan和Ubsan应该可以在Windows上运行,但有一些限制。这些可以与msvc工具链一起使

c++ - MSVC constexpr 函数 'xyz' 无法生成常量表达式

我做了一个函数,将多个较小的值连接成一个较大的值,同时保留值的二进制表示(例如,从多个unsignedcharr构建一个intargb,g,b,a).我知道我也可以通过移动值来实现这一点,但这不是这个问题的问题。但是,如果我使用该函数从这些值实际生成一个整数,则msvc会抛出一个编译器错误:errorC3615:constexprfunction'Color::operatorint'cannotresultinaconstantexpressionnote:failurewascausedbycallofundefinedfunctionoronenotdeclared'conste

c++ - 了解 MSVC++ 中的 "Buffer Security Check/GS"编译器选项

我最近惊讶地注意到,在MSVC++2010中使用/GS(启用缓冲区安全检查)进行编译似乎在某些情况下对运行时性能具有不可忽略的影响。有没有人有过这样的经历??对于大型科学风格的应用程序(网格生成库),似乎使用/GS-进行编译可以使我的几个大型基准测试的运行时间提高近10%测试套件(“大”是>=1秒的运行时间)。/GS在MSVC++2010中的所有优化级别默认处于启用状态。我必须承认,我以前从未过多关注过这个选项,我想澄清一下它的实际作用。在线documentation似乎广泛谈论字符串缓冲区,但由于我不在任何地方使用string或char[]缓冲区,我一定遗漏了一些东西。这段(来自在线

c++ - 如何使 MSVC 调试版本运行得更快

我们有一个大型C++应用程序,有时我们需要将其作为调试版本运行以调查错误。调试版本比发布版本慢得多,以至于几乎无法使用。有哪些技巧可以使MSVC调试构建执行得更快,同时又不会牺牲太多的可调试性? 最佳答案 在要在发布中调试的选定文件顶部使用#pragmaoptimize("",off)。这提供了更好的堆栈跟踪/变量View。如果只需要几个文件就可以解决问题。 关于c++-如何使MSVC调试版本运行得更快,我们在StackOverflow上找到一个类似的问题:

c++ - 为什么在 msvc++ 中我们有 _snprintf 而其他编译器允许 snprintf

“_”是什么意思?为什么微软要在开头加上这个标记? 最佳答案 全局命名空间中以_开头的标识符保留用于实现。_snprintf只是实现(VisualStudio)提供的一个函数。至于这样做的理由,VisualStudio实现了C89,而snprintf是后来的C99标准的一部分。除此之外,两个函数的语义在返回类型上是不同的,在snprintf中返回类型总是格式化字符串所占用的字符数(无论缓冲区是否有足够的空间,而_snprintf将返回负数如果缓冲区中没有足够的空间。也就是说,为您可以执行的输出分配一个足够大的缓冲区:intsize=