如果定义了两个或多个定义,是否可以触发#if宏?

问题描述 投票:0回答:1

例如,假设您只想启用一个编译目标,因此您可以执行以下操作:

// uncomment ONE of these #defines to compile for a specific target
#define TARGET_1
#define TARGET_2

#if !defined(TARGET_1) && !defined(TARGET_2) // none defined
#error "You MUST select a target platform in target_platform.h"
#elif defined(TARGET_1) && defined(TARGET_2) // too many defined
#error "You must select ONLY ONE target platform target_platform.h"
#endif 

这个效果很好。 #if 的扩展性很好。 然而,#elif 中的第二个条件不能很好地扩展到多个目标,因为条件逻辑开始变得非常复杂。 因此,有没有办法用一些 #if 条件来扩展它,我们可以检查是否为第二种情况定义了至少两个或更多? 例如,如果我有 10 个目标,如果我必须手动编写所有条件逻辑,那么编写、更新和维护就会变得非常麻烦(或者更糟糕的是,其他人必须稍后回来理解它)

我尝试查看 #if、#elif、#define、Defined()、#ifdef 和 #ifndef 的语法,但似乎没有一个适合更简洁的方式来执行此操作? 至少,我想不到。 但#if 已经让我最接近了。

c c-preprocessor metaprogramming
1个回答
0
投票

我倾向于将其写为:

#if TARGET_1
# if defined (TARGET_SELECTED)
#  error "Target is already selected"
# endif
# define TARGET_SELECTED 1
/* other target-1 stuff */
#endif

#if TARGET_2
# if defined (TARGET_SELECTED)
#  error "Target is already selected"
# endif
# define TARGET_SELECTED 1
/* other target-2 stuff */
#endif

...

#if ! defined (TARGET_SELECTED)
# error "No target has been selected"
#endif

这使得添加新目标变得非常简单,只需复制/粘贴块,重命名目标,并修复任何目标特定值。

© www.soinside.com 2019 - 2024. All rights reserved.