【问题标题】:What does \ mean while calling a function in C?在C中调用函数时\是什么意思?
【发布时间】:2020-04-15 16:54:17
【问题描述】:

我正在查看一些代码,并看到它在调用函数时使用 \ 来分隔行,这是否意味着什么?还是只是为了更具可读性?

        function(\
        lets_say_this_a_long_attribute, \
        and_this_is_another_attribute_with_a_long_name_or_operations, \
        attribute);

【问题讨论】:

  • 行继续。它是#define 宏的一部分吗?
  • 有些人甚至在#define之外使用它,完全没有抓住重点..
  • This 可能会引起您的兴趣
  • @RealReza 谢谢!我没有看到这个问题,它回答了我的问题。
  • 参见 C11 §5.11.1.2 Translation phases 和阶段 2。它只是意味着在预处理器开始执行代码之前删除了以下换行符和反斜杠。这是毫无意义;您有时会在 tyros 或新手的代码中找到它,而在经验丰富的程序员的代码中则较少。另请参阅 GCC Slightly looser rules on escaping newlines

标签: c preprocessor preprocessor-directive


【解决方案1】:

来自 C 标准 (5.1.1.2 Translation phases)

  1. 每个反斜杠字符 () 的实例紧跟一个换行符都被删除,将物理源代码行拼接到 形成逻辑源代码行。只有任何物理上的最后一个反斜杠 源线应有资格成为此类接头的一部分。一种 非空的源文件应以换行符结尾,即 之前不得紧跟反斜杠字符 这样的拼接就会发生。

例如这些物理线路

i\
n\
t\
 x;

形成逻辑线

int x;

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    i\
n\
t\
 x = 10;

    p\
r\
i\
n\
t\
f
    ( "%d\n", 
    x );

    return 0;
}

它的输出是

10

这种技术用于编写宏,例如#define。

【讨论】:

  • 而且它在处理过程中发生得如此之早,以至于您可以使用反斜杠换行符对分割注释开始和结束符号。
  • @machine_1:代码混淆器通常会这样做,将行切割成 N 个字符长,并简单地在一行末尾添加一个反斜杠并继续到下一行。但你是对的——没有恶意的理智程序员不会这样做。请注意,三元组是在阶段 2 之前处理的;它们不能跨行拆分(但??/ 可能出现在行尾以表示反斜杠换行对)。
  • 好答案。我只是遗漏了一点:任何#define 都被它后面的第一个逻辑换行符终止,这使得如果不使用\-&lt;newline&gt; 序列将多条物理行连接成一个逻辑行就无法编写多行宏.这也是在供人类消费的程序中唯一有效的用途。
  • @cmaster-reinstatemonica 将复杂的#if 表达式拆分为多行也很有用。
猜你喜欢
  • 2013-04-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多