为什么使用__LINE__的此代码在MSVC下以发布模式而不是在调试模式下进行编译?

弗朗西斯·库格勒(Francis Cugler):

考虑以下程序:

#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;
}

当我尝试在Debug模式下进行编译和构建时,Visual Studio 2017会生成以下编译器错误:

1>------ Build started: Project: Simulator, Configuration: Debug x64 ------
1>main2.cpp
1>c:\***\main2.cpp(12): error C2672: 'adds': no matching overloaded function found
1>c:\***\main2.cpp(12): error C2975: 'Line': invalid template argument for 'adds', expected compile-time constant expression
1>c:\***\main2.cpp(3): note: see declaration of 'Line'
1>Done building project "Simulator.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

但是,当我在以下Release模式下尝试时:它编译,生成,运行并产生适当的输出:

10
adds called on line 12
14

这是潜在的Visual Studio 2017错误吗?如果没有,为什么它只能在一种模式下工作而不在另一种模式下工作?

您可以在此处看到已编译的内容:编译器资源管理器


这是调试和发布模式的命令行标志的副本:

除错

/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 
Waqar:

好像有人报告过:__LINE__不能用作constexpr函数的参数

我们的C ++小组在这里有一个已知的bug。
[...]
我们已确定此问题不是错误。请参考乔纳森的评论。

乔纳森说:

这是编译器支持“编辑并继续”的副作用(基本上,我们不希望将值的更改__LINE__视为抑制“编辑并继续”的“粗略”编辑):如果使用/Zi而不是/ZI然后应编译代码(但可执行文件将不支持“编辑并继续”)。
[...]
该错误被认为是功能...

MSVC文档

/ZI选项与相似/Zi,但是它以支持“编辑并继续”功能的格式生成PDB文件。[...]该/ZI选项还与__LINE__预定义宏的使用不兼容尽管可以在宏扩展中使用,但/ZI使用编译的代码不能__LINE__用作非类型模板参数__LINE__


但是,当我在“发布”模式下尝试此操作时:它会编译,生成,运行并产生适当的输出:

我猜这是因为/ZIvs /Zi标志的不同。您的释放模式标志具有,/Zi因此可以正常编译。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在发布模式下进行调试会隐藏信息?

如何在发布模式下进行调试

为什么不正确地分配给缓冲区的内存仅在发布模式下而不在调试模式下编译时才导致崩溃?

仅调试构造函数,不在发布模式下编译

为什么此Spark代码在本地模式下有效,而在集群模式下无效?

在发布模式下崩溃,但如果可调试为真 - 不是...可能的问题是什么?

为什么在发布和调试模式下代码行为不同?

Qt在“调试”模式下正确渲染此SVG,但在“发布”模式下不正确

在发布模式下进行编译时,为什么Godbolt编译器浏览器没有显示我的函数的任何输出?

Flutter 在调试模式下比在发布时更快

如何在调试模式下使用Netbeans编译Assimp?

为什么在调试模式下获得不同的值?

在发布模式下无法使用StructureMap编译Xamarin android项目

为什么此代码使用eclipse编译器而不是javac(Maven)进行编译

使用第三方Xamarin组件时,Xamarin应用仅在调试模式下编译,而在发布模式下不编译

为什么允许此代码在Visual Studio 2013下编译?

在调试模式与发布模式下波动不同的行为

仅在调试模式下执行JS代码

代码崩溃,但仅在调试模式下

当应用程序处于调试状态时,为什么Gradle在发布模式下构建我的模块

在GWT Super Dev模式下进行调试?

QtQuick,如何知道应用程序是在调试还是发布模式下编译的?

如何确定在调试或发布模式下内置了mxmlc编译的SWF文件

为什么WildFly在Intellij IDEA的调试模式下抛出异常,而运行模式却运行良好?

在MSVC的发布模式下初始化QApplication失败

在调试和发布模式下都允许从Android应用程序进行Api访问

为什么此代码可以用g ++而不是MSVC ++编译?

具有Objective-C的应用程序,在发布模式下启动时快速代码崩溃,调试模式很好

为什么删除操作符会在调试模式下导致调试断言失败?