Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这段代码使用_行_;在MSVC下以发布模式编译,而不是在调试模式编译?_C++_Visual C++_Compiler Errors_Visual Studio 2017_Compiler Bug - Fatal编程技术网

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(英特尔编译器)不是免费提供的,尽管他们为自由和开放源码软件项目提供免费许可证(对此也不确定)。据推测,它可以为英特尔体系结构生成更快的代码(尚未尝试,因此无法确定)