C++ 为什么这段代码使用_行_;在MSVC下以发布模式编译,而不是在调试模式编译?
考虑一下这个计划:C++ 为什么这段代码使用_行_;在MSVC下以发布模式编译,而不是在调试模式编译?,c++,visual-c++,compiler-errors,visual-studio-2017,compiler-bug,C++,Visual C++,Compiler Errors,Visual Studio 2017,Compiler Bug,考虑一下这个计划: #include <iostream> template<bool Debug = false, int Line = __LINE__> constexpr int adds(const int& a, const int& b) { if (Debug) std::cout << __FUNCTION__ << " called on line " <&l
#include <iostream>
template<bool Debug = false, int Line = __LINE__>
constexpr int adds(const int& a, const int& b) {
if (Debug)
std::cout << __FUNCTION__ << " called on line " << Line << '\n';
return (a + b);
}
int main() {
std::cout << adds(3, 7) << '\n';
std::cout << adds<true, __LINE__> (5, 9) << '\n';
return 0;
}
但是,当我在Release
模式下尝试此操作时:它编译、构建、运行并生成适当的输出:
10
adds called on line 12
14
这是Visual Studio 2017潜在的bug吗?如果不是,为什么它在一种模式下工作而在另一种模式下不工作
您可以在此处看到它的编译:
以下是调试和发布模式的命令行标志的副本: 调试
/JMC /permissive- /GS /W3 /Zc:wchar_t /Qspectre /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc141.pdb" /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /std:c++latest /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\Simulator.pch" /diagnostics:classic
发布
/permissive- /GS /GL /W3 /Gy /Zc:wchar_t /Qspectre /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /std:c++latest /FC /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\Simulator.pch" /diagnostics:classic
似乎有报道说: 我们在C++团队中有这个问题的已知bug。 […]
我们已确定此问题不是一个bug。请参阅乔纳森的评论 乔纳森说: 这是编译器支持编辑并继续的一个副作用(基本上,我们不希望对
\uuuu LINE\uuuu
的值的更改被视为“粗鲁”编辑,从而抑制编辑并继续):如果您使用/Zi
而不是/Zi
进行编译,那么代码应该编译(但可执行文件不支持编辑并继续)。[…]
这个bug被认为是一个特性 发件人:
/ZI
选项类似于/ZI
,但它以支持编辑并继续功能的格式生成PDB文件。[…]/ZI
选项也与预定义宏的使用不兼容;使用/ZI
编译的代码不能将\uuuuuuuuuuuuuuuuuuuuuuuuuuu>用作非类型模板参数,尽管可以在宏扩展中使用\uuuuuuuuuuuuuuuuuuuuuuu
但是,当我在发布模式下尝试此操作时:它编译、构建、运行并生成适当的输出:
10
adds called on line 12
14
我想原因是/ZI
与/ZI
标志不同。您的发布模式标志具有/ZI
,因此它可以很好地编译。您可以显示调试和发布配置吗?(即它们使用的编译器标志)GuiNyCuito所有的东西基本上都是标准的,除了我有语言标志设置为<代码> ISO C++最新草稿标准(/STD:C++最新)对于所有的配置和平台……所有其他的东西都是VisualStudio默认值。Cool,VS默认值是什么?它可能是一个C++编译器错误,但不是VisualStudio bug。很好知道。它是你遇到的稀有东西之一…但是很好知道!所有的都是,一旦C++ 20完全支持和合作,这就不会太麻烦了。完全主流!@FrancisCugler——你是说?如果你想尝试的话,也可以使用叮当声(你可以在VS中使用它)。我听说它很好;@Waqar嗯,我也在用Python和JavaScript做其他事情。。。我只喜欢C++的能力、控制和效率,用于后端库代码库…是的,在调试模式下将/ZI
更改为/ZI
,修复了问题。。。老实说,我甚至不确定我是否使用过编辑并继续
功能。。。我已经使用OpenGL和DirectX从头开始构建了可运行的3D图形游戏引擎,并开始学习Vulkan。我目前的爱好项目是尝试从头开始构建一个电路模拟器!我已经做过硬件仿真(NES)…@FrancisCugler我提到过,它是免费提供的。是的,ICC(英特尔编译器)不是免费提供的,尽管他们为自由和开放源码软件项目提供免费许可证(对此也不确定)。据推测,它可以为英特尔体系结构生成更快的代码(尚未尝试,因此无法确定)