C源文件中的反斜杠

3

我有以下代码,和原本的格式一模一样,只是分散在不同行中:

frame_rate = (float)
                ( ( ( frames * media_timescale) + \   //WHY???
                    ( media_duration >> 1 ) ) /
                 media_duration);

我不理解源代码中反斜线的作用。 此外,要计算帧速率,我们可以按照以下步骤进行:
frame_rate = (float) ( (  frames * media_timescale) / media_duration);

写第一种代码有什么特定的意图吗?


1
那不是宏,所以那个反斜杠是毫无意义的。即使没有它,代码也完全有效。我怀疑有人从曾经的宏中抢走了那段代码,并将其保留原样。 - WhozCraig
1
+ (media_duration >> 1) 的目的是将值四舍五入,假设你在某个时刻将结果转换为 int - user3386109
4个回答

5

这是一种行延续转义符。它的意思是编译器会将下一行视为当前行的一部分。

它使您展示的代码在实践中变得更易读。

frame_rate = (float)
                ( ( ( frames * media_timescale) + ( media_duration >> 1 ) ) /
                 media_duration);

在这种情况下实际上并没有真正的必要,除了作者遵循某些样式指南的要求之外。
需要使用行继续符号来定义“多行”宏,并且通常用于长字符串。但是除了这些地方,它没有任何实际作用。

1

反斜杠用于将一行长语句分成两行较短的语句,而不表示语句结束。通常在单行语句过长以至于难以阅读时使用。


1

我已经删除了非常明显的抄袭他人示例的内容。当您想引用他人的作品时,请使用适当的引用和归属,并且仅在必要时才使用,以支持您自己的观点。 - Martijn Pieters
我不明白一个指向Python文章的链接与一个关于C语言的问题有何相关性。Python的逻辑行规则在一些关键领域与C语言不同。 - Martijn Pieters

0

我认为没有人能比标准更好地描述这个问题。因此,根据C11/section 5.1.1.2p1,当您调用编译器时,它总结了翻译(如果您愿意,可以称之为“编译”)的各个阶段:

  1. 紧随换行符后面的反斜杠字符(\)将被删除,将物理源代码行拼接成逻辑源代码行。每个物理源代码行上仅最后一个反斜杠符号可作为此类拼接的一部分。在进行任何此类拼接之前,非空源文件应以换行符结束,该换行符不得立即在任何反斜杠字符之前。

因此,从您的示例中,由于反斜杠和换行符的组合,第一行实际上被有效地“拼接”(连接)到第二行。


1
根据这个部分,不仅宏定义,而且通过反斜杠和换行符组合分成两行的代码行,例如 puts("Single" \ "Line");,也应该由预处理器转换为 puts("Single" "Line");,然后在相邻字符串连接时变成 puts("Single Line");,是吗? - dandev486
1
@dandev486,你的理解大部分是正确的;行拼接消除发生在预处理之前。 - autistic
我明白了,所以这实际上是在预处理阶段之前发生的,谢谢澄清!我原以为直到宏替换完成之前的所有步骤都由预处理器执行。 - dandev486
1
@dandev486 是的,行拼接消除在翻译阶段2中(因此标准引用开头的数字为2)。翻译阶段3是一些记号化。翻译阶段4是预处理正式开始的地方。 - autistic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接