【发布时间】:2018-01-12 09:36:27
【问题描述】:
在 C/C++ 中,以下代码运行良好。
void *pa;
void fa(void*);
int a; // or any type
pa = &a;
fa(&a);
我很困惑为什么函数的返回类型不是这样:
void fa(void);
int fb(void);
void (*pa)(void);
int (*pb)(void);
pa = fa; pb = fb; // OK
-> pa = fb; // Wrong, why???
pb = fa; // Wrong, but reasonable
既然fb的返回类型可以很好地丢弃(即直接调用fb()而不使用它的返回值),为什么标记的行不起作用?
为此编译器仍然抱怨。
void* fa(void);
int* fb(void);
void* (*pa)(void);
int* (*pb)(void);
pa = fa; pb = fb; // OK
-> pa = fb; // Wrong, why???
// pb = fa;
[Error] invalid conversion from 'int* (*)(void)' to 'void* (*)(void)' [-fpermissive]
我完全不知道为什么......
【问题讨论】:
-
这是错误的,因为它们是不同的类型。此外,C++ 略微缩小了一般
void *习语的范围。回到 C 的时代,为了方便起见,您必须在许多情况下使用void *。 C++ 不鼓励使用void *,并强调正确的类型安全设计。无论你想在这里做什么,都是错误的。你需要弄清楚如何以 100% 类型安全的方式正确地实现你正在做的事情,而不是搞乱void *。 -
根本不清楚第一段代码与另一段代码有什么关系。请注意,“void”在任何地方并不意味着相同的东西 - 在
void*它意味着“任何东西”,但它本身意味着“无”。 -
@molbdnilo 此代码
int* f(void); void* (*pf)() = f;使编译器抱怨[Error] invalid conversion from 'int* (*)(int)' to 'void* (*)(int)' [-fpermissive]。
标签: c++ casting function-pointers void-pointers