【问题标题】:Switch case on an enum that is never changed在从未更改的枚举上切换大小写
【发布时间】:2014-02-22 21:09:45
【问题描述】:

我遇到了以下代码,但似乎无法理解这里发生了什么。 枚举 pattern 永远不会改变,那么为什么要在上面加上 switch 呢?

enum pattern { PAT_ZERO, PAT_SEQ, PAT_PIPE };
static enum pattern pattern;

static ssize_t fill_in_buf(struct thread *ignore, void *buf, size_t nbytes)
{
    size_t i;
    __u8 *p;

    (void)ignore;

    switch (pattern) {
    case PAT_ZERO:
        printf("fill_in_buf PAT_ZERO\n");
        memset(buf, 0, nbytes);
        break;

    case PAT_SEQ:
        printf("fill_in_buf PAT_SEQ\n");
        for (p = buf, i = 0; i < nbytes; ++i, ++p)
            *p = i % 63;
        break;

    case PAT_PIPE:
        printf("fill_in_buf PAT_PIPE\n");
        return fread(buf, 1, nbytes, stdin);
    }

    return nbytes;
}

【问题讨论】:

  • pattern 是否被其他函数更改了?
  • @GrijeshChauhan 为什么会这样?枚举模式!= 模式
  • @tzippy:因为其他地方的一些代码改变了pattern的值?
  • pattern 必须在此处未显示的代码中使用。

标签: c switch-statement


【解决方案1】:

看起来像是测试/调试代码,程序员想要几个品种可供选择。

写得非常出乎意料,通常你会看到这是用预处理器完成的,#if defined 选择一个代码路径。

前两行可以澄清为:

static const enum { PAT_ZERO, PAT_SEQ, PAT_PIPE } pattern = PAT_ZERO;

因为没有必要为枚举引入名称,或者将变量设为非const

【讨论】:

    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2023-01-18
    相关资源
    最近更新 更多