为非静态函数指针赋值导致崩溃 - 为什么?

时间:2010-09-10 13:24:46

标签: windows crash function-pointers d

我有一个定义如下的函数:

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;
} 

它没有崩溃。

这是一种语言规则还是一种bug?为什么dmd没有警告这个?

1 个答案:

答案 0 :(得分:4)

这看起来像一个bug,虽然是DMD如何处理错误代码的一个模糊的错误。它应该最终报告和修复,但可能不是一个高优先级的错误。几点:

  1. D中的正确演员语法是cast(logprintf_t) someValue,而不是旧的C风格(logprintf_t) someValue。这是为了使演员阵容更容易。编译器通常拒绝旧的语法,所以如果没有,那就会发生一些非常奇怪的事情。但是,代码不能为我编译,因为编译器不允许使用C样式的转换语法。

  2. typedef是一个错误的功能,计划在D2中弃用和删除。因此,您不应该使用它。在D中,typedef很强大。在D中,alias与C的typedef版本具有等效的语义。

  3. 我甚至不知道在D中编译的旧C风格函数指针语法。更惯用的(并且不太可能暴露出模糊的编译器错误)语法是void function(const char* format, ...) logprintf_t

    < / LI>