c - 附加到字符串宏
问题描述
我有一个根据编译时间定义提供不同功能的程序。我定义OPT_STRING
了包含所有可能的命令行参数(与 一起使用getopt_long
)。我一直在寻找一个聪明的方法来根据编译时定义来改变它的定义。我想出了这个:
#define OPT_STRING "haspvb"
#ifdef HAVE_WIFI
#define OPT_STRING OPT_STRING "mw" // => "haspvb" "mw"
#endif // HAVE_WIFI
#ifdef HAVE_IMEI
#define OPT_STRING OPT_STRING "i" // => "haspvb" "mw" "i" or "haspvb" "i"
#endif // HAVE_IMEI
但是,这会导致编译错误:
error: "OPT_STRING" redefined
是否有某种“宏观魔术”来实现我想要做的事情?
解决方案
您不能“附加”到宏,这根本不可能。
作为一种可能的解决方案,您可以定义不同的宏,然后将它们一起使用来定义最终的OPT_STRING
宏:
#define OPT_STRING_BASE "haspvb"
#ifdef HAVE_WIFI
#define OPT_STRING_WIFI "mw"
#else
#define OPT_STRING_WIFI
#endif // HAVE_WIFI
#ifdef HAVE_IMEI
#define OPT_STRING_IMEI "i"
#else
#define OPT_STRING_IMEI
#endif // HAVE_IMEI
#define OPT_STRING (OPT_STRING_BASE OPT_STRING_WIFI OPT_STRING_IMEI)
推荐阅读
- hyperledger - 是否可以在浏览器中查看 Hyperledger Composer 事务处理器返回的值
- spring-boot - 线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/logging/log4j/util/ReflectionUtil
- r - 减去月/年得到年
- django - 如何在 Django 中使 m2m_changed 信号原子化?
- javascript - node.js http 模块请求或响应对象具有 on (addlistener) 方法,但它不在该对象或该原型和构造函数对象内
- python - BS4 find_all 与 Genius Lyrics 中的 mini_card-title 类不匹配
- vue.js - 使用 v-bind 将点击事件绑定到子组件
- java - 为什么我的作业中会出现“Context = NullPointerException”错误?
- r - 如何计算发生之间的时间(和发生的持续时间)
- docker - 本地机器上的领事健康检查失败