如何在c ++中重用函数(如isPrime,isEven,isPalindrome)

时间:2014-04-18 22:56:54

标签: c++ reusability

我无法找到重用常见自定义函数的解决方案,例如isPrime,isEven等。我知道我会反复重复使用它们,但我确实希望避免在每个.cpp文件中反复写入它们。我查看了使用头文件来包含所有这些函数,但我也听到了这个函数将与头文件中的其他函数一起编译的注释。因此,随着自定义函数数量的增加,编译时间也会变长。

另外,我想避免添加许多单独的文件,如isPrime.cpp,isEven.cpp等。

我应该如何有效地重用这些功能?请显示每个文件组织方式的简单模板。

感谢。

5 个答案:

答案 0 :(得分:3)

大约有四件事是显而易见的"解决方案。可能还有其他人。

按照"复杂性":

的顺序
  1. 在标题中添加所有函数作为内联函数。如果函数非常小,这很好,但是一旦它们变得足够大,这就不是一个好的解决方案(因为这些函数很可能在同一个可执行文件中被多次复制)。

  2. 制作一个" functions.cpp"它包含一组函数(适当选择属于一起),并在" functions.h"中声明它们。 - 现在你只需要再连接一个文件。缺点是" functions.cpp"中的所有功能。正在被包含在你的最终可执行文件中,无论它们是否实际使用(除非编译器非常聪明并且可以"杀死"死函数 - 大多数编译器都不这样做)。

  3. 建立一个图书馆。在这种情况下,每个函数需要一个源文件,它们被编译并构建到单个库文件functions.a或functions.lib中。同样,您需要一个头文件(或几个)来声明您的函数,然后链接到库以将函数包含到您的可执行文件中。当链接器构建您的最终可执行文件时,您的可执行文件所需的每个函数都需要"从图书馆中删除,但您不需要的其他功能将不会成为可执行文件的一部分。

  4. 制作共享库。这类似于构建库,除了不将函数的代码包含到可执行文件中,而是单独的"可执行文件"在构建函数时将创建共享库文件(.dll,.dynlib或.so)。当您使用共享库时,您仍然需要提供一个"库"到链接器命令,但可执行文件只有一个" stub" (或者#34; thunk")知道如何调用共享库代码。当您拥有几乎每个C ++程序使用的coutprintf之类的东西时,这非常有用,并且计算机上有数百或数千个程序,因为所有这些程序都使用SAME {{1 }或printf代码,而不是每个都有一个副本。

  5. 如果您认为在命令行中添加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;
}