首页 > 解决方案 > 为什么我们不能使用两个不同的可互换枚举?例如作为函数参数?

问题描述

使用此代码:

enum A { _1 };
enum B { _2 };

void f(A) {}

int main()
{
        f(_2);
}

C++ 编译器抱怨无法转换BA 在 Wandbox 上尝试,但使用 C 编译器我们只会收到警告(我知道 C++ 不是 C)

main.c: In function ‘f’:
main.c:11:6: warning: type of ‘A’ defaults to ‘int’ [-Wimplicit-int]
   11 | void f(A)
      |      ^
main.c:11:6: warning: unused parameter ‘A’ [-Wunused-parameter]

这是有道理的(对我来说),因为据我所知: Anenum只是一个int(无论如何short int, int, ... 取决于枚举的值)。所以:

  1. 为什么 C++ 编译器不允许我使用Bas A
  2. 而且很好用f(static_cast<A>(_2));

我的环境:

标签: c++cenums

解决方案


在 C++ 中,函数

void f(A) {}

被解释为“一个名为 f 的函数,它接受一个类型为 A 的参数,并且它的参数没有名称。” 但是,C 语言要求所有函数参数都有名称(这与 C++ 不同),因此 C 将其解释为“一个函数 f,它接受一个名为 A 的参数,并且由于 A 没有关联的类型,编译器认为它正在查看旧的C 代码中没有名称的参数具有 int 类型,所以这是一个名为 f 的函数,它采用一个名为 A 的 int。” 您从 gcc 收到的警告试图告诉您这一点,但如果没有背景故事,很难知道这意味着什么。(使用没有类型的函数参数作为隐式整数是几十年来一直不合法的 C 语言,但为了向后兼容,一些 C 编译器无论如何都接受它。)

独立 - 枚举类型具有整数值,但它们本身不是整数。在 C 和 C++ 中,您都可以将整数隐式转换为枚举类型。但是,在 C++ 中(我也相信 C,但我不确定)枚举值不是整数,不能在没有强制转换的情况下被视为另一种类型的枚举值。所以是的,您可以通过将一种枚举类型显式转换为另一种来调用该函数,但是您不能通过传递错误类型的枚举常量来调用该函数。


推荐阅读