代码之家  ›  专栏  ›  技术社区  ›  flodin

查找不匹配大括号/预处理器指令的提示和工具

c c++
  •  13
  • flodin  · 技术社区  · 17 年前

    file.cpp(3124):致命错误C1004:发现意外的文件结尾

    file.cpp包含近百个头文件,这些头文件又包含其他头文件。超过3000行。代码应该模块化和结构化,源文件更小。我们应该重构它。作为一名程序员,总有一个改进的愿望清单。

    问题是,当缺少某些内容时,编译器无法真正告诉我 它不见了。它只知道当它到达文件末尾时,它没有处于正确的解析器状态。

    您能提供一些工具或其他提示/方法来帮助我找到错误的原因吗?

    13 回复  |  直到 17 年前
        1
  •  10
  •   njplumridge    17 年前

        2
  •  8
  •   JRL    17 年前

    一种方法:如果您有Notepad++,打开所有文件(打开100个文件没有问题),搜索{和}(搜索->查找->在所有打开的文档中查找),注意计数的差异(应该是1)。随机关闭10个文件,查看计数差异是否仍然为1,如果继续,否则问题出在其中一个文件中。重复

        3
  •  4
  •   Steve Jessop    17 年前

    方便提示:

    对于每个头文件,自动生成包含它的源文件,然后可选地包含一个空的main方法,而不执行其他操作。将所有这些文件编译为测试用例,尽管运行它们没有意义。

    这个提示是从谷歌发布的C++风格指南中修改的,它指出每个组件的源文件应该包含该组件在任何其他头之前的接口标题。这具有相同的效果,即确保至少有一个源文件无法编译,并且如果该头文件有任何错误,则将其包含在内。

    当然,它不会在宏中捕捉到不匹配的大括号,因此,如果您在宏中使用了很多大括号,那么您可能必须在源文件上运行预处理器,并手动和IDE检查结果。

    更频繁地签入(在私有分支上,以防止未完成的代码妨碍其他人)。这样,当事情变得糟糕时,您可以与最后编译的内容进行比较,并将重点放在更改的行上。

        4
  •  2
  •   anon anon    17 年前

    • 进行小更改,并在每次小更改后重新编译
    • 对于不匹配的大括号,请使用支持大括号匹配照明的编辑器/IDE
    • 如果所有其他方法都失败了,使用二进制切块方法注释代码块的老方法对我来说是可行的
        5
  •  1
  •   schnaader    17 年前

    编辑:是这样吗 vim script 帮助这似乎可以。

        6
  •  1
  •   andreas buykx    17 年前

    你能创建一个脚本来完成所有的工作吗?包括,然后把所有的东西都写到一个临时文件中?或者试试编译器帮你解决这个问题?然后,您可以使用各种编辑器的括号突出显示功能来查找问题,并且您可能能够识别文件。(另一个帮助是让脚本在每个包含的文件周围添加注释)。

        7
  •  1
  •   Pierre    12 年前

    我发现,如果我将问题模块设置为不使用预编译头,问题就会消失。与“#pragma hdrstop”有关的内容不应在#if/#endif中。

        8
  •  1
  •   Steve Lorimer    8 年前

    派对很晚了,但是在linux上你可以使用 fgrep -o

      -o, --only-matching
              Print only the matched (non-empty) parts of a matching line,
              with each such part on a separate output line.
    

    fgrep -o { 然后,您将获得文件中所有大括号的列表。

    然后你可以用管道把它输送到 wc -l 这将提供文件中打开大括号的数量。

    通过一点bash算法,您可以对右大括号执行相同的操作,然后打印差异。

    git status -s 得到 short-format

    for i in $(git status -s | awk '{print $2}'); do 
        open=$(fgrep -o { $i | wc -l);   # count number of opening braces
        close=$(fgrep -o } $i | wc -l);  # count number of closing braces 
        diff=$((open-close));            # find difference
        echo "$diff : $i";               # print difference for filename
    done
    
        9
  •  0
  •   Community Mohan Dere    9 年前
        10
  •  0
  •   Makis    17 年前

    首先预编译您的代码,这将创建一个大的块,其中包含填充到同一个文件中的文件。然后您可以使用这些大括号匹配脚本。

        11
  •  0
  •   Mo Morsi    9 年前

    我最近在重构一些代码时遇到了这种情况,我不喜欢上面的任何答案。问题在于他们忽略了一个相当基本的假设:

    任何给定的文件(很可能)都有匹配的大括号和if/endif宏。


    foo.cpp

    namespace Blah{
    #include "bar.h"
    

    B.h:

    }; /// namespace Blah
    

    因此,假设任何给定的文件/模块都包含大括号和预处理器指令的匹配集,这个问题现在很容易解决。我们只需要一个脚本来读取文件/计算括号&它发现并报告不匹配的指令。

    我已经在Ruby中实现了一个,请随意选择并适应您的需要:

    https://gist.github.com/movitto/6c6d187f7a350c2d71480834892552ab

        12
  •  0
  •   radsdau    9 年前

    我只是花了一个小时来解决这样的问题。很难发现,但最后,我在一行上打了一个双精度:

    ##ifdef FEATURE_X ...

    这打破了世界。

        13
  •  0
  •   Andry    8 年前

    最简单、最快的解决方案是用一致的块从头到尾注释文件。如果错误仍然存在,则您尚未对打开的大括号进行注释。