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代码中出现问号的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse C++版无法找到头文件,在include左侧出现问号