for循环遍历C中的枚举类型引发编译错误

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

我有一个代码定义了一个简单的枚举类型,然后循环遍历它以打印相应的音节。

#include <stdio.h>

typedef enum syllable
{
  Do=1, Re=2, Mi=3, Fa=4, So=5, La=6, Ti=7
} Syllable;

void Sound(Syllable sy)
{
  switch (sy)
  {
    case Do:
      puts("Do"); return;
    case Re:
      puts("Re"); return;
    case Mi:
      puts("Mi"); return;
    case Fa:
      puts("Fa"); return;
    case So:
      puts("So"); return;
    case La:
      puts("La"); return;
    case Ti:
      puts("Ti"); return;
  }
  puts("Sing together~");
}

int main(void)
{
  Syllable tone;
  for (tone=Do; tone<Ti; tone++)
    Sound(tone);
  
  return 0;
}

但是,此代码在第

no 'operator++(int)' declared for postfix '++' [-fpermissive]
行的编译中引发错误
tone++
。我在这里做错了什么,我该如何解决才能正确循环 Syllable?

c compiler-errors post-increment postfix-operator enumerated-types
3个回答
1
投票

看来您正在将代码编译为 C++ 代码。

来自C++14标准(5.2.6自增自减)

1 后缀 ++ 表达式的值是其操作数的值。 [ 注:获取的值是原始值的副本——尾注】 操作数应为可修改的左值。操作数的类型 应为算术类型或指向完整对象的指针 类型。

和(3.9.1 基本类型)

7 类型 bool、char、char16_t、char32_t、wchar_t,以及有符号和 无符号整数类型统称为整数类型。

8 共有三种浮点类型:float、double、long 双倍的。 double 类型至少提供与 float 一样多的精度, 并且 long double 类型提供的精度至少与 双倍的。 float 类型的值集是 double 类型的值; double 类型的值集是 long double 类型的值集的子集。价值 浮点类型的表示是实现定义的。 整数和浮点类型统称为算术类型。 标准模板 std::numeric_limits 的特化 (18.3) 应指定每个算术的最大值和最小值 类型实现

如您所见,枚举不包含在 C++ 的算术类型中。所以枚举的后缀增量运算符在 C++ 中没有定义。

另一方面,在 C 中(The C Standard (6.5.2.4 Postfix increment and decrement operators)

约束

1 后缀递增或递减运算符的操作数应 具有原子的、合格的或不合格的实数或指针类型,并且应 是一个可修改的左值。

和(6.2.5类型)

17 Tchar 类型、有符号和无符号整数类型,以及 枚举类型统称为整数类型。整数 和真正的浮动类型统称为真正的类型。

在 C 中,枚举包含在整数类型族中,相应地包含在定义了后缀增量运算符的实数类型族中。

因此将您的代码编译为 C 代码。

在 C++ 中,您需要显式重载后缀增量运算符作为用户定义的函数,例如

Syllable operator ++( Syllable &e, int )
{
    Syllable tmp = e == Ti ? Do : static_cast<Syllable>( e  + 1 );

    e = e == Ti ? Do : static_cast<Syllable>( e + 1 );

    return tmp;
}

0
投票

使用 Enum Class 或仅作为 C 编译。使用 gcc 构建

如果你使用 VScode,使用 Code-Runner Extention 会有帮助。

试试

$gcc {filename} -o {outfilename}


0
投票

使用允许您在 C 中编译的编译器,您也可以在各种在线编译器上尝试它。

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