在C/C++中,以下代碼完美無缺。爲什麼不能將具有返回值的函數分配給帶void的指針函數?
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 *'中它意味着「任何東西」,但它本身意味着「無」。 – molbdnilo
@molbdnilo此代碼'int * f(void); void *(* pf)()= f;'使編譯器抱怨'[錯誤]從'int *(*)(int)'無效轉換爲'void *(*)(int)'[-fpermissive]'。 – iBug