在C / C ++文件中定义函数并在头文件中包含相应的文件

时间:2013-08-17 04:37:11

标签: c++ c include

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

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


function.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()
}

5 个答案:

答案 0 :(得分:3)

虽然习惯上在单独的头文件中定义它们,但它并不一定被视为“不良做法”。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

char *BoyerMoore_skip(char *, int );

而不是

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

答案 4 :(得分:1)

这不是一种昂贵的做法,而是一种不良做法。

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

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

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