Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一个工具可以让我的C源文件井然有序?_C_Header Files - Fatal编程技术网

有没有一个工具可以让我的C源文件井然有序?

有没有一个工具可以让我的C源文件井然有序?,c,header-files,C,Header Files,我有一些正在缓慢扩展的C源文件。我倾向于将带有.h文件中文档的原型保持在良好的状态,并使用#pragma标记将其分为相关的函数和类型。代码的编写和记录方式要求读取.h文件和.c文件。我希望这些文件能以一种方便的方式进行排序 有没有办法使.c文件中的函数声明与.h文件中的原型保持相同的顺序?我正在寻找一种工具来读取.h文件(如果可能,带有#pragma标记s),并相应地重新排序.c文件 可能吗?我以前做过代码分解。 你能得到的最接近的东西就是写一个(据我所知)。使用静态分析API,您可以解析源代码

我有一些正在缓慢扩展的C源文件。我倾向于将带有
.h
文件中文档的原型保持在良好的状态,并使用
#pragma标记
将其分为相关的函数和类型。代码的编写和记录方式要求读取
.h
文件和
.c
文件。我希望这些文件能以一种方便的方式进行排序

有没有办法使
.c
文件中的函数声明与
.h
文件中的原型保持相同的顺序?我正在寻找一种工具来读取
.h
文件(如果可能,带有
#pragma标记
s),并相应地重新排序
.c
文件


可能吗?

我以前做过代码分解。 你能得到的最接近的东西就是写一个(据我所知)。使用静态分析API,您可以解析源代码,然后根据每个头文件中的代码将所有文件组织到相应的.c文件中

一家名为“understand 4 c++”的公司提供了一个名为“understand 4 c++”的源代码分析器,它有一个c API,使这一过程变得非常简单。但是您可能必须自己编写该工具。实际上,我编写了一个托管API,它位于他们的C API之上。在codeplex上可以找到我的托管地址:

下面是我将如何构建程序

  • 首先,您必须创建一个包含所有源代码的数据库。如果需要,可以使用批处理脚本或powershell脚本执行此操作,也可以自己手动执行。它通常很简单,只需指向一个目录,实际上是说“创建一个包含其中所有文件的数据库”。您可以确定数据库中是否需要*.c、*.h或*.cpp文件

  • 然后使用API可以浏览所有扩展名为.h的文件

  • 对于每个头文件,您都要验证是否存在相应的.c文件。这是通过获取一个文件名字符串,替换文件扩展名(.NET使这变得容易),并检查文件是否存在来完成的。如果确实存在,则继续下一步

  • 然后程序应该遍历.h文件中所有定义的实体

  • 对于每个实体,它会找到对其定义(而不是声明)的引用,并查看它是否存在于相应的.c文件中。如果存在,它会找到代码定义的行号,打开文件进行读取,读取必要的代码行(以及注释),并将它们写入临时文件

  • 完成后,用临时文件覆盖.c文件

  • 继续处理数据库中的其余文件

  • 现在没那么容易了。您可能会遇到以下形式的麻烦: 1.有条件编译的代码,在这种情况下,它将使解析变得更加困难,尽管这是可能的。理解4 C++解析条件编译指令,并区分非活动代码和活动代码。但仅仅处理这件事就很难了。 2.名称空间-这将使问题复杂化

    但是,如果您只对在某些#pragma指令之间组织代码感兴趣,那么它可以再次简化问题

    如果您有更多兴趣,请告诉我,我们可以私下进行离线交谈。

    • 使用一个好的IDE。。。无需保持头文件/c文件中的顺序对齐

    • 如果这仍然不适合你。。。保存所有声明和定义 按字母顺序排列。添加新函数时,您知道在何处插入 新功能

      附言:我相信这句话:


    我怀疑你会发现这样一个现成的工具。因此,您需要一个自定义工具。你不知道 想要尝试使用一些字符串黑客方法(例如Perl)来实现这一点,因为 解析C和C++远远超出了你能可靠地完成的方式。如果你不介意的话 字符串黑客有时会破坏你的文件,也许你可以逍遥法外

    我的公司的可以用来做这件事可靠的模警告

    DMS是一个通用引擎,用于使用由显式langauge定义参数化的编译器技术解析、分析和转换源代码。DMS对多种语言有强大的语言定义, 包括C和C++在各种方言中的应用。使用DMS C或C++前端,可以解析源代码 编写代码,构建称为ASTs的编译器数据结构,对代码进行分析,转换ASTs, 然后重新生成可编译代码,包括注释和所有预处理器指令

    警告与解析包含预处理器指令的源代码有关: 它们必须具有良好的结构[e.#ifdef#endif需要像常规语句一样嵌套在其他语句周围 if等,而不是跨语句边界使用。这种情况在C代码中会发生;很多 更少的C++代码。我们的经验是,如果你愿意修改你的C代码, 你可以解决这个问题

    对于您的特定任务,您所做的与科学工具工作的答案所描述的基本相同:

  • 选择一个编译单元,并使用DMS解析它。您必须提供所有相同的信息 您提供了编译器,因此它可以定位头文件等
  • DMS为编译单元和所有头文件生成AST
  • 遍历AST以提取头和编译单元中声明的顺序
  • 根据从3)中导出的顺序重新构造编译单元树
  • 预打印生成的编译单元AST
  • [使用DMS而非科学工具进行此操作的一个原因是,DMS旨在 解析/转换/重新生成代码,而SciTool IMHO实际上只设计用于解析 DMS提供了转换所需的详细信息 SciTools没有,至少我上次看的时候没有 Humans Do it better