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

如果只使用没有单独头文件的cpp文件,有什么缺点吗?

  •  2
  • Jabba  · 技术社区  · 15 年前

    我已经找到了一些解释C++为什么分离.CPP和.h文件的线程(例如)。 here )我想知道如果我 不要 把它们分开。我不想共享对象文件,那么在一个小项目上分离有什么好处呢?如果它只是减慢了编译时间,在我看来就没什么大不了的了。我想在C++中重新实现一个Java程序,所以对我来说,只将一个类保存在一个文件中似乎要容易得多。例子:

    // Hello.cpp
    #ifndef HELLO_20091218
    #define HELLO_20091218
    
    #include <iostream>
    #include "Utils.cpp"
    
    class Hello
    {
    public:
        void start()
        {
            std::cout << Utils::nrand(100) << "\n";
            // Utils and all other classes are written in a similar way
        }
    };
    
    #endif
    

    有件事困扰着我。”在类内定义成员函数要求实现以内联方式扩展对它的调用。“因此,如果我这样做,所有内容都被隐式标记为inline。它会导致更大的可执行文件还是其他缺点?

    4 回复  |  直到 15 年前
        1
  •  3
  •   pmr    15 年前

    在C和C++中,编译的最小单位是文件。如果不使用头文件并将所有内容都包含在“主”文件中,那么每次更改某些内容时,都必须重新编译整个程序。对于更大的应用程序,这可能是分离头和实现的一个很好的理由。另外,如果应用程序的另一部分位于另一个二进制可执行文件中,并且您不想重用类,那么您可以安全地使用头文件,而没有头文件的话,您将获得大量开销。

    如果你不关心这些事情(你会后悔的),就不需要单独的头文件了。

    关于内联:无论如何,编译器将内联许多函数(有时甚至是整个类,可以这么说),即使您不要求它这样做。内联通常对性能有利。有一些角情况(大量的可执行文件可以在较慢的执行速度下解析),但这些情况非常罕见。

        2
  •  3
  •   Jerry Coffin    15 年前

    这真是两个问题。

    现在,上面显示的“hello.cpp”看起来像一个头部,带有一个include保护。编译器并不真正关心你给头起什么名字,但是包含一个.cpp文件对任何查看你的代码的人来说都是混淆的(最多)。如果您自己编译它,那么include-guard(至少)应该会消失——虽然它不会造成真正的问题,但它至多是无意义和混乱的。

    是的,在类定义中定义的成员函数是隐式内联的。但这并不意味着编译器需要为它们生成内联代码。这基本上只是对编译器的一个提示,大多数编译器自己决定是否生成内联代码,主要基于函数包含的内容,而不是函数的定义位置。

        3
  •  2
  •   wallyk    15 年前

    头文件的目的是封装应用程序视为 美国石油学会 .

    在许多情况下,对应的源文件位于单个库文件中,或者至少位于独立的包中。直接将源代码(作为单独的文件)组合到项目中是有利的,通常有助于开发,而不是构建库并将其链接到中。

    像这样的话 包裹 , 图书馆 美国石油学会 充满了交替的技术含义,证明了开发人员对这种安排的重要性。

    如果你认为你所写的类将来会有一些重用,那么把它们分开并不是一个坏习惯。 .cpp .h 文件,以便在另一个项目中轻松引用它。对于编译速度方面的惩罚,考虑长期效益与成本。(而且编译器和硬件每年都会变得更快。)

        4
  •  1
  •   Nikola Smiljanić    15 年前

    “在罗马的时候要像罗马人那样做”

    你被欺骗以为你可以选择使用像Java一样的C++。虽然这在技术上是正确的,但是您违背了一些出于某种原因而存在的非常强的约定。你可以很容易地开始使用new而不调用delete,因为“这不是什么大事”,或者“你的程序很小”,或者“操作系统会在程序关闭后回收所有内存”,但这并不意味着你应该这样做。我同意C++比Java更复杂,这可能是一个真正的痛苦,但这是你必须处理的事情。这是每个C++开发人员迟早接受的。