在 Visual Studio 中使用 __LINE__ 宏作为模板参数

Posted

技术标签:

【中文标题】在 Visual Studio 中使用 __LINE__ 宏作为模板参数【英文标题】:Using __LINE__ macro as a template parameter in visual studio 【发布时间】:2011-03-22 21:01:34 【问题描述】:

我希望下面的代码可以工作,但我收到了编译错误:

error C2975: 'n' : invalid template argument for 'foo', expected compile-time constant expression
#include <iostream>
using namespace std;

template<int N>
struct foo

    foo()  cout << N << endl; 
;

int main()

    foo< __LINE__ > f;

为什么会这样?我虽然 __LINE__ 会在模板实例化发生之前粘贴行号?

如果我想这样做,我应该只引入一个static const int 来保存行号还是有标准解决方案?

【问题讨论】:

什么版本?在VS2010中工作。 (我以前做过,但还是尝试了你的代码。) @GMan:很有趣,在 VS2010 中也进行了测试,但对我不起作用。 o_O(或者你的意思是在全局范围内定义static const int?这实际上会破坏目的......) @GMan:我正在运行 2010 年的全新安装。 @Bob: @Xeo: Wtf...什么版本?我的:“10.0.30319.1 RTMRel”。 @Bob:如果您启用/ZI(编辑并继续调试)选项,禁用此选项是否可以解决问题? 【参考方案1】:

在 VS 2010 10.0.40219.1 SP1Rel 和 Ideone 中为我工作

但 MSDN 提到了导致 C2975 的问题,如果在模板中使用 __LINE__ 和编译器选项 /ZI: MSDN C2975

编辑:对不起,我链接了德文版,here in english

【讨论】:

我也可以不使用/ZI 好发现!这也是有道理的,如果您要允许编辑并继续调试,__LINE__ 不能是编译时间常数,因为实际的代码行可以在调试会话中更改。跨度> 我必须通过执行以下操作来使用/Zi 选项:***.com/a/15521991/1294758【参考方案2】:

对于它的价值,这应该是有效的代码。 __LINE__ 应该表现得好像:

#define __LINE__ 0

当然,用当前行号替换 0。

【讨论】:

@In:为什么我们是幸运儿? :) @GMan:显然是因为我们不使用/ZI 标志。 :-) @In:啊,因为我们不会犯错,也不需要那个选项,对吧? :) 不是答案,但无论如何都值得 +1 @GMan:实际上这是因为/ZI 不适用于 64 位目标,但我会同意你的理由。 :-)【参考方案3】:

@Bob,你会爱上这个!

我对你的问题很感兴趣,所以我尝试了你的代码。它在 g++ 中编译,但在 MSVC10 中出现错误并失败。为了进行调查,我使用 Google 来了解如何查看预处理器输出:您将“属性 | C++ | 预处理器 | 预处理到文件”设置为 true。然后我再次编译......它工作了!事实证明,如果禁用此选项,则编译失败;如果启用,编译工作。我想 MS 不会费心生成 LINE 条目,除非正在捕获预处理器输出。加油!

【讨论】:

你“假设”不正确。我使用了__LINE__ 大约一百万次。 你不认为那些人已经打开了这个选项吗?

以上是关于在 Visual Studio 中使用 __LINE__ 宏作为模板参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2010 中更改 compute_'' 和 sm_'' 参数?

在 Visual Studio 2015 中使用 _ITERATOR_DEBUG_LEVEL 0 的字符串流访问冲突

visual studio .net的安装问题

C++ MS Visual Studio 错误“在函数公共中引用:void __thiscall ...”

Visual Studio 2008 内联汇编 关键字__asm出错

如何在Visual Studio 2010中使用C++“准”标准库 Boost 1.44.0