gpt4 book ai didi

c++ - __LINE__ 在 MSVC 中不是 constexpr

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:29 24 4
gpt4 key购买 nike

2022 年 11 月 28 日更新

Microsoft (R) C/C++ Optimizing Compiler Version 19.34.31933 for x86

这个问题似乎已经解决了。

原帖

好的,最新的 VS 2019 社区,本地“所有默认”C++ 控制台项目:

int main()
{
// cl Version 19.21.27702.2 for x86
//
constexpr auto MSCVER = _MSC_VER; // 1921
constexpr auto MSCFULLVER = _MSC_FULL_VER; //192127702
constexpr auto MSCBUILD = _MSC_BUILD; // 2
/*
: error C2131: expression did not evaluate to a constant
: message : failure was caused by non-constant arguments or reference to a non-constant symbol
: message : see usage of '__LINE__Var'
*/
constexpr auto LINE = __LINE__;
}

但是。看起来 Godbolt 上的同一个编译器可以编译这个。一如既往。

https://godbolt.org/z/rn44rN

有什么想法吗?

截至 2019-07-22 的状态

显然,这是一个 bug,它是一个特性。啊。还有一个几乎完美的宏,除了它转换为 int,而且 LINE 的类型很长。这是我的版本:

#define _DBJ_CONCATENATE_(a, b) a ## b
#define _DBJ_CONCATENATE(a, b) _DBJ_CONCATENATE_(a, b)

#define CONSTEXPR_LINE long(_DBJ_CONCATENATE(__LINE__,U))

原文为here .我有几乎相同的解决方案,但我添加了一个零而不是 U。可能是因为我花了几个小时试图弄清楚发生了什么。

对不起,MSVC 团队在那个页面上的推理很奇怪。我想知道标准中是否有解决此问题的详细信息。

非常感谢评论者为我指明了正确的方向。但是还有一个谜团:为什么 Godbolt + MSVC 对同样的代码没有问题?

最佳答案

MSVC 团队在该链接中指出,如果您将“调试信息格式”从“/ZI”(用于编辑和继续的程序数据库)更改为“/Zi”(程序数据库),这也会修复它(但禁用编辑并继续)。它对我有用。

如果您不使用“编辑并继续”,这似乎是正确的解决方法。

关于c++ - __LINE__ 在 MSVC 中不是 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57137351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com