相同代码的不同版本
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)。
我开发了一个小软件,它只是将文件上传到一个提供商。 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)。