C++ 在C/C+中定义函数+;文件,并在标题中包含重复文件
我在头文件中声明了一个函数,并在C++/C文件中定义了函数。已声明函数的头文件包含在定义函数的C++文件中。C++ 在C/C+中定义函数+;文件,并在标题中包含重复文件,c++,c,include,C++,C,Include,我在头文件中声明了一个函数,并在C++/C文件中定义了函数。已声明函数的头文件包含在定义函数的C++文件中。 现在,在任何其他C++中都需要函数调用,其中包含C++文件。strong>这种做法不好吗? 或者我应该只在.h文件中定义函数 函数.h char *BoyerMoore_skip(char *string, int strLength); BM.cpp: #include "function.h" char *BoyerMoore_skip(char *string, int str
现在,在任何其他C++中都需要函数调用,其中包含C++文件。strong>这种做法不好吗? 或者我应该只在
.h
文件中定义函数
函数.h
char *BoyerMoore_skip(char *string, int strLength);
BM.cpp:
#include "function.h"
char *BoyerMoore_skip(char *string, int strLength);
{
...
}
include "BM.cpp"
int main()
{
---
BoyesMoore_skip()
}
main.cpp:
#include "function.h"
char *BoyerMoore_skip(char *string, int strLength);
{
...
}
include "BM.cpp"
int main()
{
---
BoyesMoore_skip()
}
通常将所有函数声明和#定义放在单独的头文件中,并将其包含在.c或.cpp文件中。但我不认为你所做的是不好的做法。通常习惯于将所有函数声明和#定义放在单独的头文件中,并将其包含在.c或.cpp文件中。但是我不认为你所做的是不好的做法。这不一定被认为是“不好的做法”,尽管习惯上在单独的头文件中定义它们
如果您在“main方法”之前定义ODR,您可能会遇到一些ODR问题,但是我想说的是,去做吧。做你想做的。这不一定被认为是“坏习惯”,尽管习惯上在单独的头文件中定义它们
如果您在“main方法”之前定义ODR,您可能会遇到一些ODR问题,但是我想说的是,去做吧。做你想做的。我把你的问题理解为你在另一个
.cpp
文件中包含了一个.cpp
文件
如果这是你正在做的,那肯定是不好的做法!
只要您(或您的IDE)向链接器提供了所有相关文件,链接器就会将您的函数调用“连接”到函数定义
通常的做法是在一个标题中声明一组相关内容,并将该标题包含在定义这些函数的
.cpp
中以及使用这些函数的每个.cpp
中。通常,当您需要“相关”内容时,您也会将该标题包含在另一个标题中。我将您的问题理解为您将一个.cpp
文件包含在另一个.cpp
文件中
如果这是你正在做的,那肯定是不好的做法!
只要您(或您的IDE)向链接器提供了所有相关文件,链接器就会将您的函数调用“连接”到函数定义
通常的做法是在一个标题中声明一组相关内容,并将该标题包含在定义这些函数的
.cpp
中以及使用这些函数的每个.cpp
中。通常,当您需要“相关”内容时,您也会将该标题包含在另一个标题中。是的,如果您将该标题包含在多个区域中,这是一种不好的做法。因此,include的作用是:每当编译器看到一个#include时,它所做的就是将位于该区域的所有代码插入该#include所在的位置。现在,如果您要同时编译多个cpp文件,或者#包括#包含同一文件的文件。这会多次插入该代码块,从而不必要地增加程序的大小。另一个好的做法是在头文件中为大型程序使用#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
而不是
char *BoyerMoore_skip(char *string, int strLength);
是的,如果您在多个区域中包含该标题,这是一种不好的做法。因此,include的作用是:每当编译器看到一个#include时,它所做的就是将位于该区域的所有代码插入该#include所在的位置。现在,如果您要同时编译多个cpp文件,或者#包括#包含同一文件的文件。这会多次插入该代码块,从而不必要地增加程序的大小。另一个好的做法是在头文件中为大型程序使用#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
而不是
char *BoyerMoore_skip(char *string, int strLength);
这是一种昂贵的做法,而不是一种糟糕的做法 编译器应该:将此标记为一个错误,迫使您删除您认为是重复的定义,或者发出警告并接受其中一个。 然而,这种做法代价高昂的一部分是,维护此代码的下一个程序员最初会感到困惑,不得不花一些时间思考为什么会这样做。没有任何评论,猜测将比比皆是
真正的代价是如果两个原型中的一个发生了变化,而现在出现了多态性(假设是C++),它有可能产生各种新的bug,并再次迫使下一个程序员发现实际上有两个原型 这是一种昂贵的做法,而不是糟糕的做法 编译器应该:将此标记为一个错误,迫使您删除您认为是重复的定义,或者发出警告并接受其中一个。 然而,这种做法代价高昂的一部分是,维护此代码的下一个程序员最初会感到困惑,不得不花一些时间思考为什么会这样做。没有任何评论,猜测将比比皆是
真正的代价是如果两个原型中的一个发生了变化,而现在出现了多态性(假设是C++),它有可能产生各种新的bug,并再次迫使下一个程序员发现实际上有两个原型 这不是一个“坏习惯”,您应该尽量不要在头文件中定义函数。您必须处理ODR问题。请检查:-适合您自己…为每个人尝试更改。这不是“坏习惯”,您不应该尝试在头文件中定义函数。您必须处理ODR问题。请查看:-适合您自己…每个人的口味都有所变化。我认为ODR是一个定义规则:D@billz我想这两种方法都适用。。。我永远爱你