我有一个定义如下的函数:
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没有警告这个?
答案 0 :(得分:4)
这看起来像一个bug,虽然是DMD如何处理错误代码的一个模糊的错误。它应该最终报告和修复,但可能不是一个高优先级的错误。几点:
D中的正确演员语法是cast(logprintf_t) someValue
,而不是旧的C风格(logprintf_t) someValue
。这是为了使演员阵容更容易。编译器通常拒绝旧的语法,所以如果没有,那就会发生一些非常奇怪的事情。但是,代码不能为我编译,因为编译器不允许使用C样式的转换语法。
typedef
是一个错误的功能,计划在D2中弃用和删除。因此,您不应该使用它。在D中,typedef很强大。在D中,alias
与C的typedef
版本具有等效的语义。
我甚至不知道在D中编译的旧C风格函数指针语法。更惯用的(并且不太可能暴露出模糊的编译器错误)语法是void function(const char* format, ...) logprintf_t
。