【问题标题】:Can someone explain me exactly what the below definition means in the C standard about directives有人可以准确解释一下以下定义在 C 标准中关于指令的含义吗
【发布时间】:2020-06-29 00:01:54
【问题描述】:

我真正需要知道的是在指令开始之前允许使用哪些字符,因为我们都知道在开始之前可以有 换行 字符和 空白 字符before (#) 的指令现在我阅读了有关此的 C 标准,并找到了以下定义来解释这一点:

预处理指令由满足以下约束的预处理标记序列组成:序列中的第一个标记是#预处理标记,它(在翻译阶段 4 的开始)是源文件中的第一个字符(可选地在不包含换行符的空格之后)或在包含至少一个换行符的空格之后。 "C standard - read here the definition"

现在我真正需要知道的是: 它们是什么意思

(可选在空格之后不包含“换行”字符)或在空格之后至少包含一个“换行”字符

不包含换行符

至少包含一个换行符

在上面的定义中我不明白我需要知道这到底是什么意思,我需要知道

可以出现换行符的位置是在 #token 之前还是在 #token 之后 C 标准没有说明可以出现换行符的位置 (它只声明“不包含换行符" 和 "包含至少一个换行符") (它没有说明在这种情况下换行符是否可以出现在 #token 之前或 #token 之后) 即使它已经说明了在上述情况下可以出现空白字符的位置(在 # 标记之前)

【问题讨论】:

  • 即文件中的第一个非空白字符或一行中的第一个非空白字符的 C 语言。归结为# 是文件中任何行上的第一个非空白字符,以提供宏定义或预处理指令。
  • @DavidC.Rankin 谢谢。你能告诉我它们是什么意思吗?我的意思是换行符实际上可以出现在哪里
  • 在 C 和 '\n' 中是空格并且在很大程度上被忽略了。但是,当您谈论预处理标记或宏定义时,它们必须作为行中的第一个非空白字符出现。所以标准的那部分只是说如果它不是第一行,你必须在'#' 之前有一个换行符。否则,将在很大程度上被忽略。

标签: c directive non-printing-characters


【解决方案1】:

这基本上意味着# 位于行首,或者在给定行上# 之前只有空格。

这部分:

源文件中的第一个字符(可选在不包含换行符的空格之后)

如果# 位于文件的第一行,则允许在# 之前使用空格,而这部分:

或在包含至少一个换行符的空格之后。

允许在任何后续行的# 之前使用空格。

例如:

  #include <stdio.h>   // spaces before the first line
  #include <stdlib.h>  // spaces before another line, i.e, spaces and newline before a token
int x;   #include <string.h> // not allowed, other tokens preceed on same line

【讨论】:

  • 谢谢 N,你能解释一下根据 C 标准在 # 之前或 # 之后的描述实际上在哪里可以出现换行符,并且不清楚他们在 C 标准中的规定跨度>
  • @user13104441 换行符可以出现在# 之前。它们也可以出现在完整的预处理器指令之后。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多