2010-09-10 1 views
1

У меня есть функция, которая определяется следующим образом:Назначение значения указателю нестатической функции, приводящему к сбою - ПОЧЕМУ?

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

ответ

4

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

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

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

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

+0

1) Да, я просто забыл, когда писал вопрос, фиксированная 2) Я пытался использовать как ЬурейеЕ и псевдоним, он дает те же результаты для меня 3) же, как 2 – szx

+0

Тогда я не могу воспроизвести это вообще. Можете ли вы предоставить более подробную информацию о том, какое сообщение об ошибке вы получаете, когда оно падает? – dsimcha

+0

ОК, сейчас очень странно - я не могу воспроизвести его в другом приложении, но в моем случае это так! Я попытался прокомментировать строку с частью назначения, и она работала, поэтому я подумал, что проблема там ... BTW Я делаю DLL (плагин), который загружается внешним (закрытым исходным) приложением, и он не " t производит какие-либо сообщения при сбое. Он работал точно так же в C++, но теперь я перехожу к D и имею эту тупую проблему. Спасибо за ваш ответ. – szx

Смежные вопросы