不同版本的相同代码

时间:2015-12-15 10:09:09

标签: c++ macros

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

实际上我有三个相同的项目(使用相同的代码)但有三个不同的提供者。为了说明,我复制了两次文件夹项目,并仅修改了相对于提供者的源代码。

我搜索一个解决方案来加入同一个项目,然后设置一个“变量”来选择编译时的提供者

我想创建一个#define PROVIDER,提供者= [S3 | YOUTUBE | FTP],然后用代码写

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

这个解决方案有点难看,我不知道其他方式

你能帮帮我吗? 谢谢!

3 个答案:

答案 0 :(得分:1)

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

#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

我更喜欢第一个,因为它更好地记录了三个提供商的实现。

答案 1 :(得分:1)

您希望这样做的唯一安全方法是使用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();

答案 2 :(得分:1)

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