【问题标题】:Include headers in c++在 C++ 中包含标题
【发布时间】:2016-10-21 15:38:00
【问题描述】:

我有这样的事情:

//main.cpp
#include <add.h>

cin >> a;
cin >> b;
cout << add(a,b);


//add.h
#ifndef add_h
#define add_h

int add(int a, int b);

#endif 


//add.cpp
int add(int a, int b){
    return a+b;
}

我应该在 add.cpp 中也包含 add.h 还是只能在 main.cpp 中包含它?
我问是因为我在某个地方看到过,我很好奇哪种方式更好。

【问题讨论】:

  • 我认为任何 C++ 基础教科书都能解释这一点。
  • 如果不将语句封装到 int main() {}` 函数体中,您的 main.cpp 显然将无法工作。

标签: c++ header include


【解决方案1】:

您可以包含它,但这里不是必须的。

通常最好将所有声明都包含在定义它的对象中(它使您可以按任何顺序定义函数)。

这是一个例子: 如果你有 add 和 combine_add (函数调用 add() 在中间) 您必须在 combine_add 之前定义 add。 当您在文件顶部包含头文件时,您可以在添加之前定义 combine_add 而不会出现编译器错误。

【讨论】:

  • 很好的答案 - 但不需要“我希望你明白这一点”。在答案的最后。它是否存在通常会很明显,并且不会增加任何价值。
【解决方案2】:

我是否应该在 add.cpp 中也包含 add.h 或者我只能将它包含在 main.cpp?

在这种情况下,您不必拒绝。

int add(int a, int b);

add 声明的定义变得重要的时刻是在链接阶段。链接器检查所有生成的目标文件(中间编译的源文件(在这种情况下为 main.o 和 add.o),如果这些目标文件之一包含 add 的定义(因此是实现),则链接器满意并且使用该定义。cpp 文件不必知道任何关于头文件中的声明的信息,因为定义本身已经是一个声明。

为了更清楚,只要你有一个声明并且你知道你的链接器会找到那个声明的定义,你甚至不需要头文件:

Main.cpp

extern int add(int a, int b);

cin >> a;
cin >> b;
cout << add(a,b);

添加.cpp

int add(int a, int b){
    return a+b;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2019-07-04
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多