2012-09-13 18 views

回答

3

没有已知的方法来判断您是否不使用包含文件中的任何内容。这是一个未解决的问题,除非是非常微不足道的情况。

考虑以下包含文件:

int x; 

你怎么能告诉我们,如果x是或不是引用?包含该文件的编译输出可能会链接到访问x的另一个对象文件。编译后的目标文件可能会以多种方式链接多次。

1

判断包含文件是否不必要的最好方法是将其注释掉或完全删除,然后查看代码是否仍然编译。这是一个易于自动化的过程。

+0

你的意思是判断一个包含文件是否有必要的最好方法*。这不能告诉你一个包含文件是不必要的。 (例如,如果include文件包含'int x;',那么如果在该C++文件中没有引用'x''',代码仍然会被编译,但如果它在另一个文件中被引用,它将不会链接。 include是必要的,即使代码编译没有它。另一个例子是如果包含文件'#define'的东西,改变了后面的代码的行为,这是非常普遍的。) –

+0

老问题,但@DavidSchwartz我认为,在这情况下,可以肯定的是,通过“编译”马克意味着“构建”。六个之一... –

+0

最佳实践不是依靠间接包括吗?如果想要使用'std :: vector',那么即使该头已经被前一个包含,并且该项目仍然会编译,也应该包含''。所以 - 在我看来 - 只是看看代码编译是不是一个很好的解决方案。 – MikeMB

4

这些答案让我走上了墙。其他语言都是这样做的。任何支持C++的链接器都可以。这很容易:

  1. 编译一切,生产,除其他事项外,一个符号表,模块

  2. 链接。

    • 任何使用但未定义的东西都已经生成undefined external错误。
    • 所有已定义但未使用的应该会生成一个extraneous external definition警告。当你在它的时候,通过源文件对它们进行分组,并且只在该模块中没有符号被引用时才会生成警告。
  3. 要么

    • 显示警告: “嘿,伙计,你没有真正使用这个东西......所以......不管,人干杯。”,或
    • 启用一个上下文菜单选项,如“删除未使用的包含”,以清理它。

对于静态语言,你有一个符号表。 链接时,您可以看到该表中的哪些项目被使用。 你可以提供一个选项,至少突出所有不使用。

如果您确实需要构建这些东西,请执行上述步骤,然后在之后重建,以删除可能未使用的引用。如果爆炸,请将其卷回。

有一百种方法可以解决这个问题。事实上,没有一个IDE显然这样做是令人惊讶的。

至少,使其成为一个“有帮助的提示”选项。编程人员的工作不是编译器的工作。 IDE的职责是尽可能多地完成程序员的工作,相互理解最终责任在于椅子上的人。

来源我曾经写C编译器为生。

相关问题