【问题标题】:Find and replace file names to C standard查找文件名并将其替换为 C 标准
【发布时间】:2018-06-07 19:50:08
【问题描述】:

我有一个朋友共享的项目,其中包含有大小写冲突的标题(例如:#include "xyz.h" 但实际文件是Xyx.h)。

我应该如何解决这个问题?
我决定编写一个python 或bash 脚本来解析所有#include,然后搜索它们是否真的在目录中。这是一个好方法吗?
我应该使用哪一个,python 或 bash。我认为 bash 会更容易,因为它可以更轻松地处理文件和替换名称。但是我必须在我的 bash 脚本中编写正则表达式吗?

【问题讨论】:

  • 谁应对案件冲突负责,您还是您的朋友?如果是您的朋友,请让他/她进行更正;)。您使用的工具是一个偏好问题。在第一个字母的情况下总是存在差异,还是您可以有更深奥的东西,例如:#include "whatamess.h" 实际文件为 "WhAtAmEsS.h"?
  • @tnknepp 我的朋友。但它可以在他的 PC 上编译(我已经检查并看到有大小写冲突,但他的代码被编译,使用 Eclipse 上的 STM 系统工作台 - arm-gcc,openOCD)。区别并不总是在第一个字母上,它也可以是“WhAtAmEsS.h”。

标签: python bash parsing


【解决方案1】:

一个单一的防弹解决方案:

  • 选择一个命名约定 - 全小写可能是最常见的一种
  • 将所有包含文件重命名为对应的小写 - 如果它们已经是小写,则不执行任何操作
  • 始终检查所有源文件并确保它们实际上包含小写名称 - 这应该手动完成,因为您不想处理包含 #include 的乱七八糟的字符串

话虽如此,如果文件数量很少,并且文件不是太复杂,这可能是自动化的。但我的观点是,时间的收获不值得开发一个工具和它的错误风险。

【讨论】:

  • 如果可以制作一个脚本来验证 C 编码标准并在 git push 之前运行作为一个钩子,它可以被许多其他人使用。我就是为了这个。
  • @ClamentJohn:可以这样做,但我建议你不要这样做。为了在一般上下文中使用,它必须实际解析 C 源代码,因为根据 C 标准,包含几乎可以发生在文件中的任何位置,而不仅仅是在文件的开头。 Clang 附带了一个解析库,可以在这里提供帮助,但即使有帮助,它仍然远非显而易见。 #if blocs 和 cmets 或 string litterals 共享多行呢?其他库中可能有混合大小写名称的文件怎么办?
  • 是的,我明白为什么它会在未来引起很多问题,谢谢。你能推荐一个 git hook 来检查 C 编码标准吗?嵌入式和其他 C 开发人员如何使项目保持在“公司”标准中
  • @ClamentJohn: 如果无法编译,则拒绝是第一条规则。在区分大小写的系统上编译时,这就足够了。然后有很多工具可以确保某些标准(只需 google 进行 C 代码质量分析)。最后,同行评审通常很有用。
【解决方案2】:

这可能不像我最初想象的那样具有挑战性。

from glob import glob as gg

# read in list of .h files and build dictionary
hfiles = dict([(r, r.lower) for r in gg('srcDir/*.h')])

# read in c file
with open('srcDir/cfile.c', 'r') as tmp: 
    cfile = tmp.read().split('\n')

# make include replacements (assuming NO text in file prior to include statments...adjust as needed)
for r in arange(len(cfile):
    if ('# include' in cfile[r]) and (cfile[r].split()[-1] in hfiles):
        key = cfile[r].split()[-1].lower()
        cfile[r] = '# include ' + hfiles[key]

# now right out corrected c file
with open('dst/new_c_file.c', 'w') as fid:
    fid.write('\n'.join(cfile))

这不是最漂亮的代码,而且我还没有测试过它(最好在你测试过之前不要覆盖你的文件),但是一般的方法应该可以工作并且非常灵活。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 2012-06-05
    • 2018-09-05
    • 1970-01-01
    • 2011-03-22
    • 2012-12-10
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多