如何在预处理器 #ifdef 中使用 "else if"?

14
在我的项目中,程序可以执行两个操作中的一个,但永远不会同时执行两个。因此,我决定对一个类进行最佳定义,具体取决于#define预处理器变量。下面的代码可以展示我的想法,但你可能猜到它不起作用:
#ifdef CALC_MODE
typedef MyCalcClass ChosenClass;
#elifdef USER_MODE
typedef MyUserClass ChosenClass;
#else
static_assert(false, "Define CALC_MODE or USER_MODE");
#endif

所以我可以做到

#define CALC_MODE

在此之前。

如果需要,我可以放弃使用 static_assert。如何做到这一点?


2
你可以使用 #if defined(CALC_MODE)#elif defined(USER_MODE) - Retired Ninja
3
你是否正在寻找$elif defined(...)?你可能还会发现#error指令很有趣。 - StoryTeller - Unslander Monica
@RetiredNinja,没错! - Jonnas Kraft
@StoryTeller-UnslanderMonica 对,实际上在这种情况下比static_assert更好,因为它总是为false。 - Jonnas Kraft
2个回答

19

这是一些建议,主要基于您提出问题时所发表的评论:

#if defined(CALC_MODE)
    typedef MyCalcClass ChosenClass;
#elif defined(USER_MODE)
    typedef MyUserClass ChosenClass;
#else
    #error "Define CALC_MODE or USER_MODE"
#endif

2
defined 是一个运算符,而不是一个函数,就像 sizeof 一样,所以括号是不必要的,只会让代码显得混乱。更好的做法是让学生们知道它是一个指示编译器执行某些操作的运算符,而不是一个被调用的函数。 - Eric Postpischil
4
这是一个社区Wiki页面,所以随意进行编辑。不过,我认为你会发现在使用sizeof Ericsizeof(Eric)时有近乎50:50的分歧。 - Adrian Mole
6
是的,绝对不是清晰明了的。就我个人而言,我总是在 sizeofdefined 上使用圆括号,因为在我的想法中这样看起来更加干净利落。在两个阵营中都有很多人持这种观点。 - Silvio Mayolo
我大部分的编程工作都是在Windows平台上使用Microsoft工具和代码完成的,所以可能我已经习惯了他们的习惯 - Adrian Mole
你忘了说 sizeof(int)。你不能这样偷懒,哈哈。 - Алексей Неудачин

2

#elifdef#elifndefC23C++23起正式支持。

但是这些标准尚未发布(截至2023年7月),新功能还没有被编译器广泛采用,所以目前最好还是使用#if defined()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接