Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中定义函数+;文件,并在标题中包含重复文件_C++_C_Include - Fatal编程技术网

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文件中定义了函数。已声明函数的头文件包含在定义函数的C++文件中。

现在,在任何其他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我想这两种方法都适用。。。我永远爱你