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

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

它不会崩溃。

这是语言规则还是某种错误?为什么 dmd 不警告这个?

最佳答案

这看起来像一个错误,尽管是 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

关于windows - 为导致崩溃的非静态函数指针赋值 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684915/

相关文章:

windows - 在 Windows 上为 Linux 上的 Kerberos 身份验证创建 key 表

linux - Selenium grid ubuntu主机无法在Windows guest 中创建 Node

c++ - SDL 1.2 -> SDL 2.0(崩溃程序)

c++ - 函数指针的分支预测

python - Xvfbwrapper 模块返回异常

r - 完成脚本后关闭电脑

java - Android listView.setOnItemClickListener(this)在运行时崩溃

matlab - Matlab在Linux上崩溃

c - 将指针传递给不符合形式参数要求的函数

c - 使用函数指针变量的地址将函数指针分配给函数