【问题标题】:How to use "else if" with the preprocessor #ifdef?如何在预处理器#ifdef 中使用“else if”?
【发布时间】:2021-10-12 05:36:31
【问题描述】:

在我的项目中,程序可以做两件事中的一件事,但不能同时做两件事,所以我决定我能为一个类做的最好的事情是根据#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。如何做到这一点?

【问题讨论】:

  • 你可以使用#if defined(CALC_MODE)和#elif defined(USER_MODE)
  • 您在寻找$elif defined(...)吗?您可能还会发现 #error 指令很有趣。
  • @RetiredNinja 是正确的!
  • @StoryTeller-UnslanderMonica 对,在这种情况下实际上比 static_assert 更好,因为它总是错误的

标签: c++ c-preprocessor preprocessor


【解决方案1】:

这是一个建议,主要基于针对您的问题发布的 cmets:

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

【讨论】:

  • defined 是一个操作符,而不是一个函数,就像sizeof 一样,所以括号是不必要的,只是很混乱。最好让学生看到它是一个指示编译器做某事的操作符,而不是一个被调用的函数。
  • @Eric 这是一个社区 Wiki,所以请随意编辑。但是,我认为您会发现使用 sizeof Eric 与 sizeof(Eric) 的比例接近 50:50。
  • 是的,绝对不是一刀切。我个人总是在sizeof 和defined 上使用parens,只是因为在我看来它看起来更干净。两个阵营都有很多人。
  • 我的大部分编程都是在 Windows 平台上使用 Microsoft 工具和代码完成的,所以也许我选择了 their habits。
  • 你忘了说sizeof(int)。你不能这样做没有大括号哈哈
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多