我有一个定义如下的函数:
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 不警告这个?
最佳答案
这看起来像一个错误,尽管是 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
。
关于windows - 为导致崩溃的非静态函数指针赋值 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684915/