在C/C++文件中定义函数,并在头中包含重复文件

Defining the function in C/C++ file and including repective file in header

本文关键字:文件 包含重 定义 C++ 函数      更新时间:2023-10-16

我在头文件中声明了一个函数,并在C++/C文件中定义了函数。声明函数的头文件包含在定义函数的C++文件中。

现在,只要在任何其他C++中需要该函数调用,就包括该C++文件这种做法不好吗或者我应该只在.h文件中定义函数?


函数.h

char *BoyerMoore_skip(char *string, int strLength);

BM.cpp:

#include "function.h"
char *BoyerMoore_skip(char *string, int strLength);
{
    ...
}

main.cpp:

    include "BM.cpp"
    int main()
{
---
BoyesMoore_skip()
}

尽管习惯上在单独的头文件中定义它们,但这并不一定被认为是"坏做法"。

如果你在"主方法"之前定义它们,你可能会遇到一些ODR问题,但我会说去做。做你想做的。

是的,如果在多个区域中包含该标头,这是一种糟糕的做法。所以include的作用是:每当编译器看到#include时,它所做的就是获取该区域中的所有代码,并将其插入#include所在的位置。现在,如果您将多个cpp文件编译在一起,或者#include包含同一文件的文件。这会多次插入该代码块,从而不必要地增加程序的大小。另一个好的做法是在头文件中使用#ifndef#用于大型程序的endif。它看起来是这样的:

假设我有一个编码为的person.h文件

#ifndef PERSON_H_
#define PERSON_H_
#include <stdio.h>
#include <stdlib.h>
typedef char NAME[41];
typedef struct date {
    int month;
    int day;
    int year;
} DATE;
typedef struct person {
    NAME name;
    int age;
    float height;
    DATE bday;
} PERSON;
#endif

它所做的是在编译的预处理器阶段,如果没有定义PERSON_H_,它会创建它,并将#define和#endif之间的所有内容关联到该PERSON_H_token下。现在,每当预处理器遇到#include"person.h"时,它都会检查person_h_是否已经存在,如果已经存在,它就不会再次包含与person_h关联的代码。这样可以防止通过包含头文件等方式多次定义函数。

在头文件中定义函数是一种很好的做法。这些被称为函数原型。它们告诉编译器需要什么函数。原型与您所做的有点不同,您不需要声明变量名,只需要声明。所以你的功能原型是:

char *BoyerMoore_skip(char *, int );

而不是

char *BoyerMoore_skip(char *string, int strLength);

通常将所有函数声明和#定义放在一个单独的头文件中,并将其包含在.c或.cpp文件中。但我不认为你所做的是不好的做法。

我将您的问题解释为您将一个.cpp文件包含在另一个.cpp文件中。

如果你就是这样做的,那肯定是不好的做法!只要您(或您的IDE)为链接器提供了所有相关文件,链接器就会将您的函数调用"连接"到函数定义。

通常的做法是在一个标头中声明一堆相关的东西,并将该标头包含在定义这些函数的.cpp和使用这些函数的每个.cpp中。通常,当你需要"相关"的东西时,你也会把这个标题包含在另一个标题中。

与糟糕的做法相比,这是一种更昂贵的做法。

编译器应该:将其标记为错误,迫使您删除您认为重复的定义,或者发出警告并接受其中一个定义。

然而,这种做法代价高昂的部分是,下一个维护此代码的程序员最初会感到困惑,必须花一些时间思考为什么要这样做。如果没有任何评论,猜测将比比皆是。

真正的代价是,如果两个原型中的一个被更改,现在有一个多态性(假设C++),它有可能产生各种新的错误,并再次迫使下一个程序员弄清楚实际上有两个原型!!