这两者中的哪一个是实现标头的正确方法



是否应该在定义函数的源文件中 #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无论是否在该文件中包含标头。

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

它是否有区别,取决于标题的内容。

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

但是,想象一下,如果标头包含的不仅仅是函数声明?如果它定义了函数所需的某些类型怎么办?如果它定义了函数定义所需的一些常量怎么办?然后你需要一个#include.

无论如何,#include被认为是一种很好的做法,因为这样你就不需要考虑这一点,这样做实际上是免费的。

编译器

只是将整个代码从标题中放在您插入#include "header.h"的位置。所以在这个例子中,声明在函数的定义之前,它没有任何坏处。

最新更新