1

我已经在头文件中声明了一个函数,并在 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);
{
    ...
}

主.cpp:

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

5 回答 5

3

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

如果您在“主要方法”之前定义它们,您可能会遇到一些 ODR 问题,但我会说去吧。随心所欲。

于 2013-08-17T04:41:32.497 回答
1

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

于 2013-08-17T04:41:07.310 回答
1

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

如果这是您正在做的事情,那肯定是不好的做法!如果您(或您的 IDE)为链接器提供所有相关文件,链接器会将您的函数调用“连接”到函数定义。

通常的做法是在一个头文件中声明一堆相关的东西,并将该头文件包含在.cpp定义这些函数和每个.cpp使用它们的函数中。通常,当您需要“相关”内容时,您还会将该标题包含在另一个标题中。

于 2013-08-17T05:11:05.367 回答
1

是的,如果您在多个区域中包含该标题,这是一种不好的做法。所以包含的作用是这样的:每当编译器看到#include 时,它​​所做的就是获取位于该区域中的所有代码并将其插入到#include 所在的位置。现在,如果您正在一起编译多个 cpp 文件,或者 #include 文件 #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_ 定义,它会创建它并在该 PERSON_H_ 标记下关联#define 和 #endif 之间的所有内容。现在,每次预处理器遇到 #include "person.h" 时,它都会检查 PERSON_H_ 是否已经存在,如果存在,它不会再次包含与 PERSON_H_ 关联的代码。这可以防止通过包含头文件等多次定义函数。

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

char *BoyerMoore_skip(char *, int );

代替

char *BoyerMoore_skip(char *string, int strLength);
于 2013-08-17T06:22:56.263 回答
1

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

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

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

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

于 2013-08-17T07:04:24.830 回答