我在头文件中声明了一个函数,并在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()
}
答案 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 ++),它有可能产生各种新的错误,并再次迫使下一个程序员弄清楚实际上有两个原型!!