Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 将值赋给非静态函数指针会导致崩溃-为什么?_Windows_Crash_Function Pointers_D - Fatal编程技术网

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

Windows 将值赋给非静态函数指针会导致崩溃-为什么?,windows,crash,function-pointers,d,Windows,Crash,Function Pointers,D,我有一个定义如下的函数: typedef void (*logprintf_t)(const char* format, ...); logprintf_t logprintf void my_function() { logprintf = cast(logprintf_t)0x12345; } 并导致应用程序退出。但是,如果我将logprintf设置为静态(我在某处见过这个技巧),即: 它不会崩溃 这是一种语言规则还是一种bug?为什么dmd不对此发出警告 这看起来像一个bug,

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

typedef void (*logprintf_t)(const char* format, ...);

logprintf_t logprintf

void my_function() {
   logprintf = cast(logprintf_t)0x12345;
}
并导致应用程序退出。但是,如果我将logprintf设置为静态(我在某处见过这个技巧),即:

它不会崩溃


这是一种语言规则还是一种bug?为什么dmd不对此发出警告

这看起来像一个bug,尽管在DMD如何处理错误代码方面是一个模糊的bug。它应该被报告并最终修复,但可能不是一个高优先级的bug。有几点:

  • D中正确的cast语法是
    cast(logprintf\u t)someValue
    ,而不是旧的C样式
    (logprintf\u t)someValue
    。这是为了使演员阵容更强大。编译器通常会拒绝旧的语法,因此如果不拒绝,就会出现一些非常奇怪的情况。但是,代码没有为我编译,因为编译器不允许C风格的强制转换语法

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

  • 我甚至不知道用D编译的旧的C风格函数指针语法。更惯用(也不太可能暴露晦涩的编译器错误)的语法是
    void function(const char*format,…)logprintf\u t


  • 这看起来像一个bug,尽管在DMD如何处理错误代码方面是一个模糊的bug。它应该被报告并最终修复,但可能不是一个高优先级的bug。有几点:

  • D中正确的cast语法是
    cast(logprintf\u t)someValue
    ,而不是旧的C样式
    (logprintf\u t)someValue
    。这是为了使演员阵容更强大。编译器通常会拒绝旧的语法,因此如果不拒绝,就会出现一些非常奇怪的情况。但是,代码没有为我编译,因为编译器不允许C风格的强制转换语法

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

  • 我甚至不知道用D编译的旧的C风格函数指针语法。更惯用(也不太可能暴露晦涩的编译器错误)的语法是
    void function(const char*format,…)logprintf\u t


  • 1) 是的,我只是在写问题的时候忘了,修正了2)我试图同时使用typedef和alias,它给我的结果和2)相同,所以我根本无法重现。你能提供更多关于崩溃时收到的错误消息的详细信息吗?好吧,现在很奇怪-我不能在其他应用程序中复制它,但在我的应用程序中它会这样做!我试着用作业的部分来评论这一行,它奏效了,所以我认为问题就在那里。。。顺便说一句,我正在制作一个DLL(一个插件),它由外部(封闭源代码)应用程序加载,在崩溃时不会产生任何Meessage。在C++中,这种方法的效果很好,但是现在我要搬到D了,有这个愚蠢的问题。谢谢你的回复。@Zeex:对不起,我帮不了你。我基本上对DLL的东西一无所知。1)是的,我在写问题的时候忘了它,修复了2)我尝试使用typedef和alias,它给我的结果是相同的3)与2)相同,然后我根本无法复制它。你能提供更多关于崩溃时收到的错误消息的详细信息吗?好吧,现在很奇怪-我不能在其他应用程序中复制它,但在我的应用程序中它会这样做!我试着用作业的部分来评论这一行,它奏效了,所以我认为问题就在那里。。。顺便说一句,我正在制作一个DLL(一个插件),它由外部(封闭源代码)应用程序加载,在崩溃时不会产生任何Meessage。在C++中,这种方法的效果很好,但是现在我要搬到D了,有这个愚蠢的问题。谢谢你的回复。@Zeex:对不起,我帮不了你。我对DLL基本一无所知。
    void my_function() {
       static logprint_t logprintf = cast(logprintf_t)0x12345;
    }