Нет. Соглашение о вызовах stdcall имеет вызываемый объект очищает стек. Поскольку вызываемый объект очищает стек, у него нет возможности узнать во время компиляции, сколько нужно удалить, поэтому он не может иметь переменные аргументы.
Чтобы иметь переменное количество аргументов функции, вам нужно использовать cdecl, при котором вызывающая сторона очищает стек. Это все компилятор, чтобы определить, сколько аргументов передается, и поскольку вызывающая сторона очищает стек, он также знает, сколько нужно вытолкнуть из стека, когда вызов функции возвращается.
В случае, упомянутом выше, функция объявляется для использования __stdcall
, которая, как упоминалось ранее, не поддерживает переменные аргументы. В этом случае компилятор принимает решение игнорировать определенное соглашение о вызовах и вернуться к __cdecl
. Это поведение упоминается в описании stdcall а>, упомянутое выше. Я цитирую:
Вызываемый объект очищает стек, поэтому компилятор делает функции vararg __cdecl.
Это можно наблюдать, если скомпилировать следующий код и дизассемблировать вызов функции.
int __stdcall Bar(int a, int b, ...)
{
return b * a;
}
Полученный код будет обработан как __cdecl
. Что касается причины, что это определено именно так, я не знаю.
person
linuxuser27
schedule
01.09.2010