2010-09-10 53 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

相关问题