相同代码的不同版本
Different different version of same code
我开发了一个小软件,它只将文件上传到一个提供程序。可以在编译之前设置提供程序。
事实上,我有三个相同的项目(使用相同的代码),但有三个不同的提供商。为了举例说明,我已经复制了两次文件夹项目,并且只修改了与提供者相关的源代码。
我搜索一个解决方案来加入同一个项目,并在编译时设置一个"变量"来选择提供者
我想创建一个#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)。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 为什么这两个版本的代码给出不同的输出
- 读取代码中的文件版本值
- 为什么此代码上的排序算法不调用类的交换版本?
- AWS 开发工具包 C++ 代码不适用于发布版本
- 代码在Visual C ++中无法按预期工作(来自bjarne stroustrup编程和原则书籍2n版本的示例)
- 不同版本的设备的代码结构
- 使用FFMPEG代码的RTSP服务器的FFMPEG版本错误
- 如何编写更好、更干净的银行帐户代码版本
- 在避免代码重复和冲突名称的同时,如何实现多个版本的同一算法
- 这两个版本的代码有什么区别
- 代码中定义c++版本的内容是什么
- 如何将VDT的Pade Exp fast_ex()的双重版本的标量代码转换为SSE2?
- collect2:错误:ld 在制作带有代码块的 .so 文件(64 位版本)时返回 1 个退出状态
- 旧版本的Fortran做循环Manova代码
- 使用不同版本编译的相同代码提供不同的结果
- 如何将此代码重构为多线程版本
- 无法读取代码页不匹配的文件版本信息
- Unity-当前版本是否生成本机代码
- 如何以最少的重复管理并行和顺序版本代码