2010-09-10 50 views
1

我具有被這樣定義的函數:將值分配給導致崩潰的非靜態函數指針 - 爲什麼?

typedef void (*logprintf_t)(const char* format, ...); 

logprintf_t logprintf 

void my_function() { 
    logprintf = cast(logprintf_t)0x12345; 
} 

,它會導致應用程序退出。但是,如果我做了logprintf是靜態的(我在什麼地方見過這種把戲),即:

void my_function() { 
    static logprint_t logprintf = cast(logprintf_t)0x12345; 
} 

它不會崩潰。

是不是這樣的語言規則的事情或一種錯誤的?爲什麼dmd不警告這件事?

回答

4

這看起來像一個錯誤,儘管在DMD如何處理錯誤的代碼一個不起眼的錯誤。應該最終報告並修復它,但可能不會成爲高優先級的錯誤。有幾點:

  1. 在d正確的投語法cast(logprintf_t) someValue,不老C風格(logprintf_t) someValue。這是爲了讓表演變得可愛。編譯器通常會拒絕舊的語法,所以如果沒有的話,會有奇怪的事情發生。但是,我的代碼不能編譯,因爲編譯器不允許使用C風格的轉換語法。

  2. typedef是真實定於D2棄用和移除越野車的功能。因此,你不應該使用它。在D中,typedefs很強大。在D中,alias與C的版本typedef具有同等語義。

  3. 我甚至都不知道在D中編譯的舊的C風格函數指針語法。更習慣的(並且不太可能暴露難懂的編譯器缺陷)語法是void function(const char* format, ...) logprintf_t

+0

1)是啊,我剛纔忘了當在寫一個問題,固定2)我試圖同時使用的typedef和別名,它給我3)同2 – szx 2010-09-10 14:38:22

+0

相同的結果,那麼我就不能重現這一切。你能提供更多關於你崩潰時得到的錯誤信息的細節嗎? – dsimcha 2010-09-10 14:43:41

+0

好吧,現在非常奇怪 - 我無法在其他應用程序中重現它,但在我的應用程序中卻是這樣!我嘗試評論與賦值部分行,它的工作,所以我認爲這個問題在那裏...順便說一句我正在製作一個DLL(一個插件)是由外部(閉源)應用程序加載,它不'當碰撞時不會產生任何消息。它在C++中正好用這種方式工作,但現在我正在轉向D並且有這個愚蠢的問題。無論如何感謝您的回覆。 – szx 2010-09-10 15:07:37

相關問題