gpt4 book ai didi

c++ - 新的 __LINE__ 什么时候开始?

转载 作者:可可西里 更新时间:2023-11-01 16:37:08 24 4
gpt4 key购买 nike

我不明白以下程序的输出:

#include <iostream>

#define FOO std::cout << __LINE__ << ' ' \
<< __LINE__ << '\n';
int main()
{
FOO

std::cout << __LINE__ << ' ' \
<< __LINE__ << '\n';
}

第一个输出是77,说明FOO的展开是单逻辑行,但是第二个输出是910,表示两条不同的逻辑行。为什么会有差异?

最佳答案

因为

1:  #include <iostream>
2:
3: #define FOO std::cout << __LINE__ << ' ' \
4: << __LINE__ << '\n';
5: int main()
6: {
7: FOO // the first two __LINE__s come from here, that's one line of code
8:
9: std::cout << __LINE__ << ' ' \ // 3rd __LINE__ comes from here
10: << __LINE__ << '\n'; // 4th __LINE__ comes from here
11: }

__LINE__ 扩展为物理行,而不是逻辑行:

The line number of the current source line is one greater than the number of new-line characters read or introduced in translation phase 1 (2.2) while processing the source file to the current token.

虽然以 \ 结尾的行在翻译阶段 2 中连接。

另一个唯一合乎逻辑的实现是为 FOO 的调用打印 3 和 4,但这似乎不是很有用。

您还可以按以下方式查看:__LINE__ 与任何其他宏没有任何不同。它只是在每一行的开头由编译器自动更新。所以代码是这样解释的:

#include <iostream>

#define __LINE__ 3
#define FOO std::cout << __LINE__ << ' ' \
<< __LINE__ << '\n';
int main()
{
#define __LINE__ 7
FOO

#define __LINE__ 9
std::cout << __LINE__ << ' ' \ // Yeah, you're right
#define __LINE__ 10
<< __LINE__ << '\n';
}

这不是有效的代码,但它演示了事情是如何工作的。应用通常的宏扩展规则,您将获得您所获得的输出。

关于c++ - 新的 __LINE__ 什么时候开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4291205/

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