【问题标题】:How to define multiple similar macro using "##"?如何使用“##”定义多个相似的宏?
【发布时间】:2013-01-30 09:50:43
【问题描述】:

我不知道是否已经有人问过同样的问题,但我在此处使用 [c] [macro] "##" 的高级搜索找不到它。

我想定义多个宏如下:

#define CHANNEL_0  0
#define CHANNEL_1  1
...
#define CHANNEL_31 31

我可以使用这个符号## 以简单的方式做到这一点吗?如何? 或者有什么办法?

谢谢!

【问题讨论】:

  • 我认为这是不可能的。不能是带有参数的单个宏吗?类似#define CHANNEL(x) x
  • 你不应该这样做。如果频道号是频道号,则只需使用int。 C 标准库中没有像 INT_FIRST 1 这样的宏是有原因的。不要过度设计事物。
  • @H2CO3 这与过度工程无关。它使其他人更容易维护和理解代码。你不能只使用纯数字。

标签: c macros


【解决方案1】:

我不认为“##”是这里最好的解决方案。为什么不直接使用 enum?如果只需要 0 到 31 之间的数字,我认为没有理由不能使用它。

enum eChannel {
    Channel0, /* evaluates to 0 */
    Channel1, /* evaluates to 1 */
    ...
    Channel31 /* evaluates to 31 */
};

而且用法同#defines

if(channel == Channel1) do_smth();

【讨论】:

  • 有了这个建议,## 可以使用 - enum eChannel { Channel##0... 虽然我不知道为什么使用 ## 有任何帮助。
  • @KBart 我知道枚举可以节省一些数字输入,我想做的是保存通道输入。而 31 只是一个例子,如果我有 128 个 Channels 呢?
  • 嗯,我没有看到任何简单的解决方案(没有一些“魔法”,对于现实生活中的项目来说,这绝不是一个好主意)。但我也不明白,当您实际上只需要一个数字时,为什么需要这样的 #defines 。但是,如果您坚持这一点,可能的解决方案之一是自动生成头文件并将其包含在您的代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多