相同代码的不同版本

Different different version of same code

本文关键字:版本 代码      更新时间:2023-10-16

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

事实上,我有三个相同的项目(使用相同的代码),但有三个不同的提供商。为了举例说明,我已经复制了两次文件夹项目,并且只修改了与提供者相关的源代码。

我搜索一个解决方案来加入同一个项目,并在编译时设置一个"变量"来选择提供者

我想创建一个#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不允许进行字符串比较。


另一种解决方案是在命令行上命名提供者类:

#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的非敏感情况,因为您将得到非常好的预处理器错误。

更好的是,你可以把它放在一个头文件中,然后完全删除基类提供者,因为你可以这样做:

provider_type * provider = new provider_type();

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