这两种方法中的哪一种是实现标头的正确方法?

时间:2019-06-09 16:26:07

标签: c++ function header

是否应在定义函数的源文件中包含#include函数声明的标头?

我都尝试过,但似乎都可以。我想知道哪种方式更可取,或者是否可能在其他编译器中导致错误

//header.h
#ifndef HEADER_H
#define HEADER_H
int squareVal (int);
#endif

//squareVal.cpp
//should I #include "header.h" here as well? 
int squareVal (int val){
return (val*val);
}

//main.cpp
#include"header.h"
using namespace std;

int main(){
cout << squareVal(2) << endl;
}

这两种方法似乎都可行。从我的测试和研究看来,无论链接头是否包含在该文件中,链接器都能够找到squareVal.cpp。

3 个答案:

答案 0 :(得分:1)

使用#include指令。将其放在所有其他#include指令之前。这样,如果头文件中有错误,编译器将更有可能找到它。特别是,如果您以不同于定义方式的方式声明函数,则编译器会注意到。如果不拉入标题,则使用该标题的翻译单元将看到与已定义的签名不同的签名,并且在尝试链接时会出错。尽早发现问题会容易得多。

答案 1 :(得分:0)

编译器只是将整个代码从标头插入您插入#include "header.h"的位置。因此,在此示例中,声明在函数定义之前,并且没有任何坏处。

答案 2 :(得分:0)

是否有所不同,取决于标题的内容。

在这种特定情况下,由于函数定义不需要先前的函数声明,因此#include中的squareVal.cpp并不是(而且永远不会)是必需的。

但是,想像一下标头包含的内容是否大于函数声明?如果它定义了函数所需的某些类型怎么办?如果它定义了函数定义所需的一些常量怎么办?然后,您需要一个#include

无论如何#include被认为是一种好习惯,因为那样一来您就无需考虑这一点,并且这样做实际上是免费的。