C代码中出现问号

Posted

技术标签:

【中文标题】C代码中出现问号【英文标题】:Occurrences of question mark in C code 【发布时间】:2011-07-16 13:05:51 【问题描述】:

我正在做一个简单的程序,它应该计算三元运算符 ?: 在 C 源代码中的出现次数。我正在尽可能地简化它。所以我从源代码中过滤了这些东西:

    字符串文字“” 字符常量'' 三字母序列 ??=、??( 等 评论 宏

现在我只计算问号的出现次数。

所以我的问题是:是否有任何其他符号、运算符或其他任何可能导致问题的东西 - 包含“?” ?

假设源是语法有效的。

【问题讨论】:

【参考方案1】:

在 K&R ANSI C 中,唯一可以有效出现问号的地方是:

    字符串文字“” 字符常量'' 评论

现在您可能会注意到此列表中缺少宏和三元组序列。

我没有包含三元字符序列,因为它们是编译器扩展而不是“有效的 C”。我并不是说你应该从你的程序中删除检查,我想说你已经比 ANSI C 需要的更进一步。

我也没有包括宏,因为当您谈论可能出现在宏中的字符时,您可能意味着两件事:

    宏名称/标识符 宏实体

那个?字符不能出现在宏标识符中(http://***.com/questions/369495/what-are-the-valid-characters-for-macro-names),我将宏体视为常规 C 代码,所以第一个列表(字符串文字、字符常量和 cmets*)也应该涵盖它们。

* 宏可以有效地包含 cmets 吗?因为如果我使用这个:

#define somemacro 15 // this is a comment

那么// this is a comment 不是宏的一部分。但是如果我用-D somemacro="15 // this is a comment" 编译这个C 文件呢?

【讨论】:

三字母序列是有效的 C。参见 the standard 中的 5.2.1.1 -1 整个帖子都不正确。这就是为什么你应该参考 ISO C 而不是一些 K&R mumbo ANSI jumbo。 Trigraphs 是完全有效的标准 C。在 C 标准第 5.2.1.1 章或 K&R 2nd 版中阅读所有关于它们的信息。另外供您参考,K&R 第 1 版和第 2 版对 // cmets 一无所知。它们不是有效的 K&R mumbo ANSI jumbo C。 对不起。我是 C 新手,我刚刚完成了 K&R 1st 版本。认为所有这些信息(尽管仍然是一本好书)仍然相关,这对我来说是愚蠢的。 如果您像您声称的那样对 C 语言不熟悉,您不应该三思而后行吗?【参考方案2】:

在预处理的源代码上运行您的工具(您可以通过运行例如gcc -E 来获得它)。这将完成所有宏扩展(以及 #include 替换),并消除所有三元组和 cmets,因此您的工作将变得更加容易。

【讨论】:

+1 使用良好的现有软件来消除问题 确定+1。尽管 OP 已经接受了我写的内容,但这可能是他或其他人在类似情况下所需要的。这一切都归结为他/她想数什么。 不允许调用 gcc 和其他,并且不保证可用性。分析器是 Perl 脚本...【参考方案3】:

我认为您找到了所有引入问号的地方,因此消除了所有可能的误报(对于三元运算)。但也许你消除了太多:也许你想计算那些由宏引入的“?:”;你不算那些。那是你的意图吗?如果是这样,你就完成了。

【讨论】:

+1,我的帖子几乎是相同的答案。预处理代码将是一个简单的选择,在每个出现的宏定义中计算一次 ?: 恕我直言是公平的选择。 是的,取决于 OP 想要什么 :-) 删除宏是一项要求,所以这种行为是正确的 :)

以上是关于C代码中出现问号的主要内容,如果未能解决你的问题,请参考以下文章

c语言中":"(冒号)和问号是啥意思

Eclipse C++版无法找到头文件,在include左侧出现问号

为啥visual+studio+code里面用c语言写的printf输出中终端显示问号?

Logback日志输出问号的问题解决方案

解释 ES6/JSX 代码中使用的问号 (?)

电脑中所有模拟器下载后打开错误码都是问号