我无法找到重用常见自定义函数的解决方案,例如isPrime,isEven等。我知道我会反复重复使用它们,但我确实希望避免在每个.cpp文件中反复写入它们。我查看了使用头文件来包含所有这些函数,但我也听到了这个函数将与头文件中的其他函数一起编译的注释。因此,随着自定义函数数量的增加,编译时间也会变长。
另外,我想避免添加许多单独的文件,如isPrime.cpp,isEven.cpp等。
我应该如何有效地重用这些功能?请显示每个文件组织方式的简单模板。
感谢。
答案 0 :(得分:3)
大约有四件事是显而易见的"解决方案。可能还有其他人。
按照"复杂性":
的顺序在标题中添加所有函数作为内联函数。如果函数非常小,这很好,但是一旦它们变得足够大,这就不是一个好的解决方案(因为这些函数很可能在同一个可执行文件中被多次复制)。
制作一个" functions.cpp"它包含一组函数(适当选择属于一起),并在" functions.h"中声明它们。 - 现在你只需要再连接一个文件。缺点是" functions.cpp"中的所有功能。正在被包含在你的最终可执行文件中,无论它们是否实际使用(除非编译器非常聪明并且可以"杀死"死函数 - 大多数编译器都不这样做)。
建立一个图书馆。在这种情况下,每个函数需要一个源文件,它们被编译并构建到单个库文件functions.a或functions.lib中。同样,您需要一个头文件(或几个)来声明您的函数,然后链接到库以将函数包含到您的可执行文件中。当链接器构建您的最终可执行文件时,您的可执行文件所需的每个函数都需要"从图书馆中删除,但您不需要的其他功能将不会成为可执行文件的一部分。
制作共享库。这类似于构建库,除了不将函数的代码包含到可执行文件中,而是单独的"可执行文件"在构建函数时将创建共享库文件(.dll,.dynlib或.so)。当您使用共享库时,您仍然需要提供一个"库"到链接器命令,但可执行文件只有一个" stub" (或者#34; thunk")知道如何调用共享库代码。当您拥有几乎每个C ++程序使用的cout
或printf
之类的东西时,这非常有用,并且计算机上有数百或数千个程序,因为所有这些程序都使用SAME {{1 }或printf
代码,而不是每个都有一个副本。
如果您认为在命令行中添加2-3个文件需要大量工作,我建议您远离使用LLVM。这些是我为构建编译器而添加的库(幸运的是,有一个工具可以自动执行此操作):
-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter -lLLVMIRReader -lLLVMAsmParser -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMMCParser -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMJIT -lLLVMLineEditor - lLLVMMCDisassembler -lLLVMInstrumentation -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMProfileData -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld -lLLVMExecutionEngine -lLLVMMC -lLLVMObject -lLLVMBitReader -lLLVMCore -lLLVMSupport
答案 1 :(得分:2)
您可以拥有标题文件,其中包含函数的定义和声明(例如functions.hpp
),并在您使用函数时包含它({{1 }}):
#include "functions.hpp"
否则,您可以在其中定义函数签名的头文件(例如,// functions.hpp
void func() { … }
// main.cpp
#include "functions.hpp"
int main() {
func();
}
)和一个用于定义它们的文件(例如,functions.hpp
)。< / p>
function.cpp
在后者中,您必须编译// functions.hpp
void func();
// functions.cpp
#include "functions.hpp"
void func() { … }
// main.cpp
#include "functions.hpp"
int main() {
func();
}
并将目标文件与functions.cpp
链接。
答案 2 :(得分:2)
执行此操作的常用方法是在头文件中声明方法,然后在另一个文件中定义它们。例如,在common.hpp
中你可以放置:
bool isPrime(int number);
bool isEven(int number);
然后在common.cpp
里面你可以把:
bool isPrime(int number) { ... }
bool isEven(int number) { ... }
然后您#include "common.hpp"
可以访问这些功能。请注意,如果您不使用include guard,则可能会遇到同一方法的多个声明问题。
答案 3 :(得分:1)
宣布&#34; #pragma一次&#34;也是一个好主意。在您的头文件中。这样,如果您的头文件已包含在另一个头文件中,并且第三个文件包含第二个头文件但也包含第一个头文件,您将避免多个包含。如果您没有使用Visual Studio,那么请在#ifndef块:
之间编写头文件内容#ifndef HEADER_FILE
#define HEADER_FILE
//your header file contents go here
#endif
答案 4 :(得分:0)
// ------------------------
// utilities.h
bool isPrime( int );
bool isEven( int );
// ------------------------
// utilities.cpp
#include utilities.h
bool isPrime( int a ){ ... }
bool isEvent( int a ){ ... }
// ------------------------
// other.cpp
#include utilities.h
int main()
{
isPrime( 2 );
return 0;
}