0

给定以下代码:

1.  #include <iostream>
2.  #define CALL_FUNC(f) f();
3.
4.  int main()
5.  {
6.    CALL_FUNC([](){
7.      std::cout << "I'm on line " << __LINE__ << std::endl;
8.    });
9.    return 0;
10. }

当我在 Visual Studio 2012 和 g++ 4.7.3 中编译它时,我得到输出“我在第 8 行”。

当我用 clang 编译它时,我得到了“我在第 7 行”的输出,这是我所期望的。

有谁知道其中哪一个是正确的行为?有没有办法在 VS 和 g++ 中获得所需的行为,同时仍然有一个 CALL_FUNC 宏?

4

2 回答 2

4

该标准没有规定宏扩展和__LINE__预定义宏之间的交互。特别是跨越多行并包含__LINE__令牌的宏调用在不同的预处理器上表现出不同的行为。当扩展宏参数的一部分时,有些会给出封闭宏头名称的行号(6),一些右括号(8)和一些__LINE__标记行(7)。这取决于所使用的算法,并且有几种是有效的且符合标准的。

这可以证明如下:

#define F(x) x
F(
__LINE__
)

一些预处理器将输出 2、一些 3 和一些 4。

于 2013-07-30T20:35:54.937 回答
2

一个快速测试似乎表明,如果你将它});向上移动一行它可以工作:

std::cout << "I'm on line " << __LINE__ << std::endl;});

gcc 和 msvc 似乎认为它在下一行,因为});在下一行。(另外,你有一个额外的分号 BTW)。

于 2013-07-30T19:18:07.670 回答