Я столкнулся с проблемой с MSVC и ICC:
Мне нужно использовать аргументы varadic с условным вызовом stdcall, но компилятор игнорирует его для функций varadic и повреждает стек.
Легкий способ исправить это состоит в том, чтобы просто принять количество аргументов как один из аргументов и компенсировать ESP
до того, как он будет поврежден, но в этом случае мне не нужно количество аргументов для контекста функции, поэтому скорее избегайте его если возможно.
Кто-нибудь знает, есть ли способ сделать это?
Согласно документации:
Вызов очищает стек, поэтому компилятор выполняет функции
__cdecl
.
Учитывая это, я не уверен, как вы ожидаете продолжения. Если stdcall
требует, чтобы вызывающая сторона очищала стек, но в vararg-функциях вызываемый пользователь не мог узнать, что в стеке во время компиляции, как бы он работал? Вы ожидаете, что макросы stdarg
va_list
будут манипулировать кадром вызова? Я не думаю, что Microsoft видит это, поэтому то, что вы просите, не представляется возможным, по крайней мере, не путем написания C с использованием компилятора Microsoft.
stdcall
вызываемый абонент отвечает за очистку стека. Поскольку вызываемый не знает ни количества аргументов, ни количества стекового пространства, занимаемого аргументами, он не может логически очистить стек без предоставления дополнительной информации. То, что вы пытаетесь сделать, не является хорошей идеей, и любая попытка заставить его работать, скорее всего, потребует гораздо больших усилий, чем оно того стоит. Это звучит как проблема XY, и вы должны действительно переосмыслить то, что вы пытаетесь достичь.