我有三个密切相关的应用程序,它们是从相同的源代码构建的 - 比方说APP_A,APP_B和APP_C.APP_C是APP_B的超集,APP_B又是APP_A的超集.
到目前为止,我一直在使用预处理器定义来指定正在构建的应用程序,它就像这样工作.
// File: app_defines.h #define APP_A 0 #define APP_B 1 #define APP_C 2
然后我的IDE构建选项指定(例如)
#define APPLICATION APP_B
...在源代码中,我会有类似的东西
#include "app_defines.h" #if APPLICATION >= APP_B // extra features for APPB and APP_C #endif
然而,我今天早上在脚上射击并且浪费了很多时间,只需从一个文件中省略#include"app_defines.h"的行.一切编译得很好,但应用程序在启动时与AVs崩溃.
我想知道更好的处理方法是什么.以前,这通常是我认为#define可以使用的少数几次之一(无论如何都是在C++中),但我仍然很糟糕,并且编译器没有保护我.
您并不总是必须在共享公共代码库的应用程序中强制继承关系.真.
有一个旧的UNIX技巧,您可以根据argv [0]定制应用程序的行为,即应用程序名称.如果我没记错的话(我看了它已经20年了),rsh和rlogin是同一个命令.您只需根据argv [0]的值进行运行时配置.
如果您想坚持使用构建配置,那么这就是通常使用的模式.您的构建系统/ makefile将命令上的符号定义为APP_CONFIG为非零值,然后您有一个包含配置螺母和螺栓的公共包含文件.
#define APP_A 1 #define APP_B 2 #ifndef APP_CONFIG #error "APP_CONFIG needs to be set #endif #if APP_CONFIG == APP_A #define APP_CONFIG_DEFINED // other defines #endif #if APP_CONFIG == APP_B #define APP_CONFIG_DEFINED // other defines #endif #ifndef APP_CONFIG_DEFINED #error "Undefined configuration" #endif
此模式强制配置是命令行定义且有效.
你想做的事情似乎与"产品线"非常相似.Carnigie Melon University在这里有一个很好的页面:http://www.sei.cmu.edu/productlines/
这基本上是一种构建具有不同功能的一个软件的不同版本的方法.如果您想象像Quicken Home/Pro/Business这样的东西,那么您就会走上正轨.
虽然这可能不是您尝试的,但这些技术应该会有所帮助.