jjzjj

c++ - MSVC 中的虚拟继承错误

看来我的问题是MSVC中的错误。我正在使用带有ServicePack1的VisualStudio2008,并且我的代码适用于GCC(在codepad.org上测试过)。关于这个错误的任何官方信息?任何想法如何解决它?VS2010中的bug修复了吗?我们将不胜感激所有见解。代码:structBase{Base(inti=0):i(i){}virtual~Base(){}virtualBase*clone()const=0;protected:inti;};structA:virtualpublicBase{A(){}virtualA*clone()const=0;};structB:pu

c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改

我试图为dll导出一个简单的测试函数,以便与指定调用约定为的应用程序(仅供引用:mIRC)一起使用:int__stdcalltest_func(HWNDmWnd,HWNDaWnd,char*data,char*parms,BOOLshow,BOOLnopause)现在,要从应用程序中调用它,我会使用test_func,但我注意到由于名称修改,它并不像我想象的那么简单。通过此处的类似主题,我了解到将extern"C"与__declspec(dllexport)结合使用是一种等效的(某种程度上)消除重整的方法到模块定义(.def)。但是,当使用extern/dllexport方法时,我的函

c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改

我试图为dll导出一个简单的测试函数,以便与指定调用约定为的应用程序(仅供引用:mIRC)一起使用:int__stdcalltest_func(HWNDmWnd,HWNDaWnd,char*data,char*parms,BOOLshow,BOOLnopause)现在,要从应用程序中调用它,我会使用test_func,但我注意到由于名称修改,它并不像我想象的那么简单。通过此处的类似主题,我了解到将extern"C"与__declspec(dllexport)结合使用是一种等效的(某种程度上)消除重整的方法到模块定义(.def)。但是,当使用extern/dllexport方法时,我的函

c++ - 为什么 MSVC 在执行此位测试之前会发出无用的 MOVSX?

在MSVC2013中编译以下代码,64位发行版,/O2优化:while(*s==''||*s==','||*s=='\r'||*s=='\n'){++s;}我得到了以下代码——它使用64位寄存器作为查找表进行了非常酷的优化,带有bt(位测试)指令。movrcx,17596481020928;0000100100002400Hnpad5$LL82@myFunc:movzxeax,BYTEPTR[rsi]cmpal,44;0000002cHjaSHORT$LN81@myFuncmovsxrax,albtrcx,raxjaeSHORT$LN81@myFuncincrsijmpSHORT$LL

c++ - 为什么 MSVC 在执行此位测试之前会发出无用的 MOVSX?

在MSVC2013中编译以下代码,64位发行版,/O2优化:while(*s==''||*s==','||*s=='\r'||*s=='\n'){++s;}我得到了以下代码——它使用64位寄存器作为查找表进行了非常酷的优化,带有bt(位测试)指令。movrcx,17596481020928;0000100100002400Hnpad5$LL82@myFunc:movzxeax,BYTEPTR[rsi]cmpal,44;0000002cHjaSHORT$LN81@myFuncmovsxrax,albtrcx,raxjaeSHORT$LN81@myFuncincrsijmpSHORT$LL

c++ - 用于维护 API 向后二进制兼容性的 GCC 与 MS C++ 编译器

我来自Linux世界,知道很多关于维护用C++语言编写的动态库API的向后二进制兼容性(BC)的文章。其中之一是"Policies/BinaryCompatibilityIssuesWithC++"基于ItaniumC++ABI,由GCC编译器使用。但我找不到与MicrosoftC++编译器(来自MSVC)类似的东西。我了解大多数技术都适用于MSC++编译器,我想发现与ABI差异(v-table布局、修改等)相关的编译器特定问题所以,我的问题如下:在维护BC时,您知道MSC++和GCC编译器之间的区别吗?在哪里可以找到有关MSC++ABI或在Windows中维护APIBC的信息?任何相

c++ - 用于维护 API 向后二进制兼容性的 GCC 与 MS C++ 编译器

我来自Linux世界,知道很多关于维护用C++语言编写的动态库API的向后二进制兼容性(BC)的文章。其中之一是"Policies/BinaryCompatibilityIssuesWithC++"基于ItaniumC++ABI,由GCC编译器使用。但我找不到与MicrosoftC++编译器(来自MSVC)类似的东西。我了解大多数技术都适用于MSC++编译器,我想发现与ABI差异(v-table布局、修改等)相关的编译器特定问题所以,我的问题如下:在维护BC时,您知道MSC++和GCC编译器之间的区别吗?在哪里可以找到有关MSC++ABI或在Windows中维护APIBC的信息?任何相

c++ - 到 std::function<R(ARGS...)> 的可变参数模板转换适用于 GCC 而不是 MSVC2013,为什么?

如果这是重复的,我很抱歉。但我在搜索中找不到任何内容。我可以使用c++11/c++14的任何最新功能。如有必要,我可以升级到VS2015。我正在尝试编写一个类,该类在分配时将自动转换为具有特定签名的std::function。我有适用于GCC的代码,但在MSVC2013上失败了。该代码是重新创建错误的片段。WTFMSVC?!我也知道这是有风险的代码,自动转换函数指针等,但它是用于插件库的私有(private)实现,我只想定义一次函数签名。如果有另一种方法可以编写代码,在main()中完成相同的功能并同时在两者上工作,我会全力以赴。GCCc++11工作正常-Demo#include#in

c++ - 到 std::function<R(ARGS...)> 的可变参数模板转换适用于 GCC 而不是 MSVC2013,为什么?

如果这是重复的,我很抱歉。但我在搜索中找不到任何内容。我可以使用c++11/c++14的任何最新功能。如有必要,我可以升级到VS2015。我正在尝试编写一个类,该类在分配时将自动转换为具有特定签名的std::function。我有适用于GCC的代码,但在MSVC2013上失败了。该代码是重新创建错误的片段。WTFMSVC?!我也知道这是有风险的代码,自动转换函数指针等,但它是用于插件库的私有(private)实现,我只想定义一次函数签名。如果有另一种方法可以编写代码,在main()中完成相同的功能并同时在两者上工作,我会全力以赴。GCCc++11工作正常-Demo#include#in

c++ - __attribute__((format(printf, 1, 2))) 用于 MSVC?

使用GCC,我可以指定__attribute__((format(printf,1,2))),告诉编译器该函数采用printf格式说明符的可变参数。这在我包装的情况下非常有用,例如vsprintf函数族。我可以有externvoidlog_error(constchar*format,...)__attribute__((format(printf,1,2)));每当我调用这个函数时,gcc将检查参数的类型和数量是否符合给定的格式说明符,就像它检查printf一样,如果不符合,则发出警告。MicrosoftC/C++编译器有类似的吗? 最佳答案