我开发了一个小软件,只是将文件上传到一个提供商。可以在编译之前设置提供程序。
实际上我有三个相同的项目(使用相同的代码)但有三个不同的提供者。为了说明,我复制了两次文件夹项目,并仅修改了相对于提供者的源代码。
我搜索一个解决方案来加入同一个项目,然后设置一个“变量”来选择编译时的提供者
我想创建一个#define PROVIDER,提供者= [S3 | YOUTUBE | FTP],然后用代码写
#ifdef S3
provider = new S3Provider();
#elif YOUTUBE
provider = new YoutubeProvider();
#else
provider = new FtpProvider();
#endif
这个解决方案有点难看,我不知道其他方式
你能帮帮我吗? 谢谢!答案 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)稍后。