为什么我们不能使用两个不同的枚举可互换?,例如作为函数参数?
Why We Couldn't Use Two Different enum Interchangeable?, e.g. As Function Parameter?
使用此代码:
enum A { _1 };
enum B { _2 };
void f(A) {}
int main()
{
f(_2);
}
C++ 编译器抱怨无法将 B
转换为 A
(try it on 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]
(对我而言)这是有道理的,因为据我所知:enum
只是一个 int
(无论 short int
、int
、.. . 取决于枚举的值)。所以:
- 为什么 C++ 编译器不允许我将
B
用作 A
?
- 并且可以使用
f(static_cast<A>(_2));
?
我的环境:
- 编译器:
GCC 11.1.0
- 编译器标志:
-Wall -Wextra -Wpedantic
- OS:
ArchLinux 5.13.13-arch1-1
在 C++ 中,函数
void f(A) {}
被解释为“一个名为 f 的函数,它接受类型 A 的参数,并且它的参数没有名称。”但是,C 语言要求所有函数参数都有名称(这与 C++ 不同),因此 C 将其解释为“一个函数 f,它接受一个名为 A 的参数,并且由于 A 没有关联类型,编译器认为它正在寻找旧的C 代码,其中没有名称的参数的类型为 int,因此这是一个名为 f 的函数接受一个名为 A 的 int。”你从 gcc 得到的警告试图告诉你这一点,但如果没有那个背景故事,很难知道它意味着什么。 (使用没有类型的函数参数作为隐式整数是几十年来在 C 中不合法的东西,但为了向后兼容,一些 C 编译器无论如何都接受它。)
独立 - 枚举类型具有整数值但本身不是整数。在 C 和 C++ 中,您可以将整数隐式转换为枚举类型。但是,在 C++ 中(我相信 C 也是如此,但我不确定)枚举值不是整数,并且不能在没有转换的情况下被视为另一种类型的枚举值。所以是的,您可以通过将一种枚举类型显式转换为另一种来调用该函数,但是您不能通过传递错误类型的枚举常量来调用该函数。
使用此代码:
enum A { _1 };
enum B { _2 };
void f(A) {}
int main()
{
f(_2);
}
C++ 编译器抱怨无法将 B
转换为 A
(try it on 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]
(对我而言)这是有道理的,因为据我所知:enum
只是一个 int
(无论 short int
、int
、.. . 取决于枚举的值)。所以:
- 为什么 C++ 编译器不允许我将
B
用作A
? - 并且可以使用
f(static_cast<A>(_2));
?
我的环境:
- 编译器:
GCC 11.1.0
- 编译器标志:
-Wall -Wextra -Wpedantic
- OS:
ArchLinux 5.13.13-arch1-1
在 C++ 中,函数
void f(A) {}
被解释为“一个名为 f 的函数,它接受类型 A 的参数,并且它的参数没有名称。”但是,C 语言要求所有函数参数都有名称(这与 C++ 不同),因此 C 将其解释为“一个函数 f,它接受一个名为 A 的参数,并且由于 A 没有关联类型,编译器认为它正在寻找旧的C 代码,其中没有名称的参数的类型为 int,因此这是一个名为 f 的函数接受一个名为 A 的 int。”你从 gcc 得到的警告试图告诉你这一点,但如果没有那个背景故事,很难知道它意味着什么。 (使用没有类型的函数参数作为隐式整数是几十年来在 C 中不合法的东西,但为了向后兼容,一些 C 编译器无论如何都接受它。)
独立 - 枚举类型具有整数值但本身不是整数。在 C 和 C++ 中,您可以将整数隐式转换为枚举类型。但是,在 C++ 中(我相信 C 也是如此,但我不确定)枚举值不是整数,并且不能在没有转换的情况下被视为另一种类型的枚举值。所以是的,您可以通过将一种枚举类型显式转换为另一种来调用该函数,但是您不能通过传递错误类型的枚举常量来调用该函数。