У меня недавно возникли проблемы с указателями функций CUSTBACK custm, и это сводилось к использованию соглашений о вызовах, которые решают проблему temporaly, funy CALLBACK действительно хорошо работает, но сигнатура вызывающей функции все еще ошибочна !! и я потратил много времени на то, чтобы найти этот BUG. понял, что caling соглашение позволит вам сделать что-то, что не в порядке, иногда ...Существуют ли стандартные соглашения о вызовах?
Хорошо, что прошлое теперь ... Теперь, я хочу знать, Лил больше о соглашениях о вызове: Visual Studio имеет собственный __cdecl
, __thiscall
, и т.д. (IIRC).
Является ли стандартный C++ регламентирующим некоторые соглашения о вызовах и как я могу их использовать, если так?
EDIT: Некоторый код, на который я не смог найти ошибку:
class Object;
class EventArgs;
typedef void(__cdecl Object::*MethodHandler)(Object* sender, EventArgs args);
///..... this is how I call it..(snapshot)
(iter->second.sender->*iter->second.memberFunct)(sender, args);
///...
void __cdecl Triger(EventArgs args) //missing "Object* sender" here!!! but it works!
{
if(args == "test")
cout << "test args received" << endl;
}
(. Кстати, имена типов моих пользовательских классов) Это работало просто отлично! Функция была вызвана, но без __cdecl
Я получил ошибки регистра ESP.
Какая ошибка? Как правило, жестко закодированный указатель функции для регистрации обработчика/обратного вызова без ошибки компилятора является мертвой датой совершения чего-то неправильного. В приведенном выше коде «Триггер», безусловно, не относится к типу MethodHandler, поскольку аргументы функции различны. – selbie
спасибо, нет, это не та же подпись, но она отлично работает с помощью __cdelc, если я не использую __cdecl, тогда ошибка регистра ESP и прогрм chrush .. очень интересно для меня .. – codekiddy
Это работает, потому что вам повезло с уважением к порядку, в котором аргументы попадают в стек. Трюк cdecl, вероятно, просто массирует стек, чтобы он не разбивался. Где-то в вашем коде вы делаете «(MethodHandler *) Trigger» (или void * cast), чтобы зарегистрировать эту функцию с помощью службы обратного вызова без ошибки компиляции.Если вы исправите свой код таким образом, чтобы код компилировался без приведения, ваш сбой исчезнет. Это означает, что во всем мире одинаковое соглашение о вызове и список одинаковых аргументов. – selbie