首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新的__LINE__什么时候开始?

问新的__LINE__什么时候开始?
EN

Stack Overflow用户
提问于 2010-11-27 18:37:32
回答 4查看 311关注 0票数 9

我不理解以下程序的输出:

代码语言:javascript
复制
#include <iostream>

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

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

第一个输出是7和7,表示FOO的扩展是单个逻辑行,但第二个输出是9和10,表示两个不同的逻辑行。为什么会有区别呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-27 18:57:50

因为

代码语言:javascript
复制
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__扩展到物理线路,而不是逻辑线路:

当前源代码行的行号比将源文件处理为当前标记时在转换阶段1 (2.2)中读取或引入的新行字符数多一。

而以\结尾的行在转换阶段2中级联。

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

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

代码语言:javascript
复制
#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';
}

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

票数 5
EN

Stack Overflow用户

发布于 2010-11-27 18:41:01

因为#define扩展包含确保__LINE__是宏被“调用”的那个。否则,许多错误消息对用户来说是没有意义的。

票数 3
EN

Stack Overflow用户

发布于 2010-11-27 18:39:52

原因是您在#define语句中定义的语句,该语句始终计算为一行。然而,第二种情况实际上是两行代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4291205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档