Присвоение значения указателю на нестатическую функцию, приводящему к сбою - ПОЧЕМУ? - PullRequest
1 голос
/ 10 сентября 2010

У меня есть функция, которая определяется следующим образом:

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 не предупреждает об этом?

1 Ответ

4 голосов
/ 10 сентября 2010

Это похоже на ошибку, хотя и неясную ошибку в том, как DMD обрабатывает неправильный код. Это должно быть сообщено и исправлено в конце концов, но, вероятно, не будет ошибкой с высоким приоритетом. Несколько баллов:

  1. Правильный синтаксис приведения в D - cast(logprintf_t) someValue, а не старый стиль C (logprintf_t) someValue. Это сделано для того, чтобы броски можно было использовать. Компилятор обычно отклоняет старый синтаксис, поэтому, если это не так, происходит что-то ужасно странное. Однако код для меня не компилируется, потому что компилятор не допускает синтаксис преобразования в стиле C.

  2. typedef - это ошибочная функция, которая запланирована для устаревания и удаления в D2. Поэтому не стоит его использовать. В D typedefs сильны. В D alias имеет семантику, эквивалентную версии C typedef.

  3. Я даже не знал старого синтаксиса указателя функции в стиле C, скомпилированного в D. Более идиоматический (и менее вероятный выявить скрытые ошибки компилятора) синтаксис void function(const char* format, ...) logprintf_t.

...