2014-04-01 49 views
1

這是正確的代碼嗎?返回類型不同的函數指針

class SomeClass; 

SomeClass* createSomeClass(); // just returns new SomeClass 
void* (*createFuncPtr)(); 

int main() 
{ 
    createFuncPtr= (void* (*)()) &createSomeClass; 
    SomeClass* instance = (SomeClass*)createFuncPtr(); 
} 

C標準表示:

768如果轉換後的指針被用來調用其類型是 不與被指向的鍵入,該行爲是未定義兼容的功能。

在這種情況下,功能類型是否兼容?或者我是否在調用它之前強制重新調用函數指針,如果我想避免這種麻煩?

SomeClass* instance = ((SomeClass* (*)())createFuncPtr)(); 

謝謝!

編輯:是的,它包含C++代碼,但如果只有C,我的問題仍然有效,請留下C標記。

+2

你想完成什麼? – rubenvb

+0

只是得到一個具體問題的答案;) – Jerem

回答

1

從C99標準節6.7.5.1,第2段:

要使兩種指針類型兼容,既應相同合格兩者應指針兼容的類型。

在你的情況下,函數指針是不兼容的,因爲返回值是不兼容的。所以,是的,你必須在調用指向函數之前退出。

+1

謝謝菲利普,它使感。但是,什麼是兩個_兼容的類型呢?你有一個兼容類型的例子,這個函數指針可以工作嗎? – Jerem

+0

@JeremyLaumon底線是'void'和'someClass'不兼容的類型,因爲它們是不同的類型。類型兼容性的規則相當長,但你可以看看C99中的6.2.7節。 –

-2

你需要將它轉換回正確的類型,否則你很可能會損壞你的堆棧。看到更詳細的,有點搞笑的描述在這裏:Old New Thing: A function pointer cast is a bug waiting to happen

編輯:既然你需要將其轉換爲正確的類型反正你可能也只是用一個空指針(編輯:因爲一個空指針不工作會有一個更小的尺寸,感謝Filipe)而不是錯誤的函數指針來存儲指針,以避免意外地錯誤地調用它。或者使用正確的函數指針類型。或者一個std :: function對象,這取決於你的目標。

+0

不,你不能使用'void *'來存儲一個函數指針。 –

+0

我認爲這錯過了商標。 – unwind

+0

@Filipe 它在哪裏說的,爲什麼不起作用?具有不同大小的指針的函數和void指針的瘋狂平臺? – nwp