C++ c++;:#包括和不同的文件类型

C++ c++;:#包括和不同的文件类型,c++,C++,我不知怎么搞不懂这个想法,阅读文档对我也没有帮助 我的问题是: 当我包含一个头文件#include“general.h”,并且在我的项目目录中有两个文件general.h和general.cpp时,这是否意味着预编译器将自动找到.cpp文件 我可以包括没有扩展名的文件吗?#包括“常规” 我是否可以包含没有任何头文件的文件:#包含“general.cpp” 我可以包括一个txt文件吗?#包括“general.txt” 我在VisualStudio2010中尝试了这一切。至少没有语法错误。但我想解释

我不知怎么搞不懂这个想法,阅读文档对我也没有帮助

我的问题是:

  • 当我包含一个头文件#include“general.h”,并且在我的项目目录中有两个文件general.h和general.cpp时,这是否意味着预编译器将自动找到.cpp文件
  • 我可以包括没有扩展名的文件吗?#包括“常规”
  • 我是否可以包含没有任何头文件的文件:#包含“general.cpp”
  • 我可以包括一个txt文件吗?#包括“general.txt”

  • 我在VisualStudio2010中尝试了这一切。至少没有语法错误。但我想解释一下。因此,我希望您能友好地帮助我。

    指令告诉预处理器读取文件。就这些。

    指令告诉预处理器读取文件。仅此而已。

    预处理器在遇到#include指令时只插入给定文件的全部内容。

    预处理器在遇到#include指令时只插入给定文件的全部内容

  • 不,预编译器对.cpp文件一无所知

  • 是,如果文件没有扩展名

  • 您可以包含任何您想要的文件。这并不意味着你会从中得到任何有用的东西

  • 见第3点。上面

  • 不,预编译器对.cpp文件一无所知

  • 是,如果文件没有扩展名

  • 您可以包含任何您想要的文件。这并不意味着你会从中得到任何有用的东西

  • 见第3点。上面


  • 标准和编译器并不真正关心文件是
    .cpp
    还是
    .h
    还是
    .monkeyface
    。将源代码结构化为实现和头文件背后的概念实际上只是帮助管理源代码的公认方法。尽管如此,不以公认的方式构造源通常被认为是不正确的或坏的C++。
    #include
    所做的只是告诉预处理器将您指定的文件内容包含在当前文件中。这就像将另一个文件复制并粘贴到您的文件中一样。当你说
    #include“foo.h”
    时,它只包含
    foo.h
    的内容,根本不关心
    foo.cpp
    ——它甚至不知道它存在(而且它没有存在的理由)

    在实现和头文件中结构化源代码是非常有用的—它避免了依赖项和多个定义的问题,并在一定程度上提高了编译时间。当您的代码使用另一个类时,您只需要包含该类的头文件。原因是您的代码不需要关心类的实现,它只需要知道类的外观(名称、成员、基类等)。它不关心成员函数的具体实现方式

    扩展名
    .cpp
    .h
    只是惯例。有些人喜欢使用
    .hpp
    作为头文件。有些人甚至使用
    .tpp
    来实现模板。您可以随意命名它们-是的,您甚至可以包含一个
    .txt
    文件。您的编译器可能会尝试从文件扩展名推断有关文件的内容(例如,编译文件的语言),但这通常是可重写的

    因此,如果您的
    main.cpp
    包含
    foo.h
    ,因为它使用类
    foo
    ,那么
    foo.cpp
    在什么时候参与?嗯,在编译
    main.cpp
    时,它一点也不涉及
    main.cpp
    不需要知道类的实现,正如我们上面讨论的那样。但是,在编译整个程序时,您将把
    .cpp
    文件分别传递给编译器进行编译。也就是说,您可以执行类似于
    g++main.cpp foo.cpp
    的操作。编译
    foo.cpp
    时,它将包含需要编译的头文件


    编译完每个
    .cpp
    文件后(包括它们所依赖的标题),然后将它们链接在一起。在
    main.cpp
    中使用成员函数
    foo::bar()
    将在这个阶段与
    foo.cpp
    中给出的
    foo::bar()
    的实现相联系。标准和编译器并不真正关心文件是
    .cpp
    还是
    .h
    还是
    .monkeyface
    。将源代码结构化为实现和头文件背后的概念实际上只是帮助管理源代码的公认方法。尽管如此,不以公认的方式构造源通常被认为是不正确的或坏的C++。
    #include
    所做的只是告诉预处理器将您指定的文件内容包含在当前文件中。这就像将另一个文件复制并粘贴到您的文件中一样。当你说
    #include“foo.h”
    时,它只包含
    foo.h
    的内容,根本不关心
    foo.cpp
    ——它甚至不知道它存在(而且它没有存在的理由)

    在实现和头文件中结构化源代码是非常有用的—它避免了依赖项和多个定义的问题,并在一定程度上提高了编译时间。当您的代码使用另一个类时,您只需要包含该类的头文件。原因是您的代码不需要关心类的实现,它只需要知道类的外观(名称、成员、基类等)。它不关心成员函数的具体实现方式

    扩展名
    .cpp
    .h
    只是惯例。一些