在C/C++文件中定义函数,并在头中包含重复文件
Defining the function in C/C++ file and including repective file in header
我在头文件中声明了一个函数,并在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);
{
...
}
main.cpp:
include "BM.cpp"
int main()
{
---
BoyesMoore_skip()
}
尽管习惯上在单独的头文件中定义它们,但这并不一定被认为是"坏做法"。
如果你在"主方法"之前定义它们,你可能会遇到一些ODR问题,但我会说去做。做你想做的。
是的,如果在多个区域中包含该标头,这是一种糟糕的做法。所以include的作用是:每当编译器看到#include时,它所做的就是获取该区域中的所有代码,并将其插入#include所在的位置。现在,如果您将多个cpp文件编译在一起,或者#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_token下。现在,每当预处理器遇到#include"person.h"时,它都会检查person_h_是否已经存在,如果已经存在,它就不会再次包含与person_h关联的代码。这样可以防止通过包含头文件等方式多次定义函数。
在头文件中定义函数是一种很好的做法。这些被称为函数原型。它们告诉编译器需要什么函数。原型与您所做的有点不同,您不需要声明变量名,只需要声明。所以你的功能原型是:
char *BoyerMoore_skip(char *, int );
而不是
char *BoyerMoore_skip(char *string, int strLength);
通常将所有函数声明和#定义放在一个单独的头文件中,并将其包含在.c或.cpp文件中。但我不认为你所做的是不好的做法。
我将您的问题解释为您将一个.cpp
文件包含在另一个.cpp
文件中。
如果你就是这样做的,那肯定是不好的做法!只要您(或您的IDE)为链接器提供了所有相关文件,链接器就会将您的函数调用"连接"到函数定义。
通常的做法是在一个标头中声明一堆相关的东西,并将该标头包含在定义这些函数的.cpp
和使用这些函数的每个.cpp
中。通常,当你需要"相关"的东西时,你也会把这个标题包含在另一个标题中。
与糟糕的做法相比,这是一种更昂贵的做法。
编译器应该:将其标记为错误,迫使您删除您认为重复的定义,或者发出警告并接受其中一个定义。
然而,这种做法代价高昂的部分是,下一个维护此代码的程序员最初会感到困惑,必须花一些时间思考为什么要这样做。如果没有任何评论,猜测将比比皆是。
真正的代价是,如果两个原型中的一个被更改,现在有一个多态性(假设C++),它有可能产生各种新的错误,并再次迫使下一个程序员弄清楚实际上有两个原型!!
- 在读取文件后重置句柄
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- C++文件包含多行
- CMake 如何强制third_party库将项目文件包含在当前项目源目录中?
- 是否可以将要"ShellExecute"的文件包含在 dll 中?如果是这样,"ShellExecute"中的文件位置应该是什么?
- C++ 逐行从文件(包含空格)读取数据
- 在 C++ 中,.h 文件包含文件但不起作用
- 生成的资源文件包含奇怪的包含文件
- 如何在 C++ 中将文件从 ext4 文件系统重命名为 ntfs 文件系统
- 可变参数类的文件包含问题
- 为什么文件命令声明可执行文件包含"debug_info"
- 可以将标头文件包含在多个源文件中,而无需重复保护
- 为什么将.HPP文件包含在.h文件中
- Qt C++:将所有库文件包含在项目文件夹中
- 有条件地将文件包含在C++标头中
- 将多个原型文件包含在一个项目中会导致protobuf_AssignDescriptorsOnce()已经有一个主体
- 有没有办法将文件包含在C++中的所有项目文件中
- 将外部.asm文件包含到C++代码中
- 什么是"pch.h",为什么需要将其作为第一个头文件包含在内?
- 该头文件包含DirectX 12中的ThrowIfFailed()