相同代码的不同版本

Different different version of same code

我开发了一个小软件,它只是将文件上传到一个提供商。 provider可以在编译前设置。

实际上我有三个相同的项目(具有相同的代码)但有三个不同的提供商。为了说明,我复制了两次文件夹项目,只修改了与提供程序相关的源代码。

我搜索了一个加入同一个项目的解决方案,只是在编译时设置了一个"variable"来选择提供者

我想创建一个#define PROVIDER,provider = [ S3 | YouTube | FTP ],然后写代码

#ifdef S3
provider = new S3Provider();
#elif YOUTUBE
provider = new YoutubeProvider();
#else
provider = new FtpProvider();
#endif

这个方案有点丑,不知道其他的方法

你能帮帮我吗? 谢谢!

如果您想要条件编译,那么预处理器定义实现它的方式,尽管您可以在命令行上传递值而不是将其写入源代码。

#if defined(USE_S3)
provider = new S3Provider();
#elif defined(USE_YOUTUBE)
provider = new YoutubeProvider();
#elif defined(USE_FTP)
provider = new FtpProvider();
#else
#error You must specify a provider!
#endif

并编译

c++ -DUSE_S3 blah.cc

请注意,您不能使用-DPROVIDER=S3,因为#if不允许字符串比较。


另一种解决方案是在命令行上命名提供程序 class:

#ifndef PROVIDER
#error You must specify a provider!
#endif

provider = new PROVIDER ();  // The space before () is important!

然后用

编译
c++ -DPROVIDER=S3Provider

我更喜欢第一个,因为它可以更好地记录实施了三个提供程序。

唯一安全的方法是使用 typedef

typedef PROVIDER_TYPE provider_type;

provider =  new provider_type();

g++ -DPROVIDER_TYPE=S3编译得到S3

现在,你不能像 g++ -DPROVIDER_TYPE=x -DPROVIDER_TYPE=y 那样得到无意义的情况,因为你会得到非常好的预处理器错误。

更好的是,您可以将其放入头文件中并完全删除基础 class 提供程序,因为您可以这样做:

provider_type * provider = new provider_type();

您可以使用一些 配置 文件(默认情况下可能位于定义明确的位置,例如 Linux 上的 ~/.myprogconf)并让您的程序解析它并在以后使用一些通用(HTTP 和 FTP 客户端)库(例如 libcurl)。