Как использовать varargs с __stdcall без компилятора, разрушающего стек

0

Я столкнулся с проблемой с MSVC и ICC:

Мне нужно использовать аргументы varadic с условным вызовом stdcall, но компилятор игнорирует его для функций varadic и повреждает стек.

Легкий способ исправить это состоит в том, чтобы просто принять количество аргументов как один из аргументов и компенсировать ESP до того, как он будет поврежден, но в этом случае мне не нужно количество аргументов для контекста функции, поэтому скорее избегайте его если возможно.

Кто-нибудь знает, есть ли способ сделать это?

  • 2
    По умолчанию вы не можете. При использовании stdcall вызываемый абонент отвечает за очистку стека. Поскольку вызываемый не знает ни количества аргументов, ни количества стекового пространства, занимаемого аргументами, он не может логически очистить стек без предоставления дополнительной информации. То, что вы пытаетесь сделать, не является хорошей идеей, и любая попытка заставить его работать, скорее всего, потребует гораздо больших усилий, чем оно того стоит. Это звучит как проблема XY, и вы должны действительно переосмыслить то, что вы пытаетесь достичь.
  • 0
    @CaptainObvlious Это не традиционная функция. И действительно, самое хорошее решение - сделать то, что я прошу (если это возможно). Но посмотри мой ответ на ответ Джона; это объясняет немного больше.
Теги:
visual-c++
icc

1 ответ

1

Согласно документации:

Вызов очищает стек, поэтому компилятор выполняет функции __cdecl.

Учитывая это, я не уверен, как вы ожидаете продолжения. Если stdcall требует, чтобы вызывающая сторона очищала стек, но в vararg-функциях вызываемый пользователь не мог узнать, что в стеке во время компиляции, как бы он работал? Вы ожидаете, что макросы stdarg va_list будут манипулировать кадром вызова? Я не думаю, что Microsoft видит это, поэтому то, что вы просите, не представляется возможным, по крайней мере, не путем написания C с использованием компилятора Microsoft.

  • 0
    В 99% случаев было бы смешно пытаться, и я согласен. К сожалению, в моей функции он очищает стек должным образом, но я не могу не очистить стек, потому что это делает не мой код.
  • 2
    @Nowayz Не стесняйся, это смешно в 100% случаев.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню