Безопасно ли возвращать структуру из функции dd stdcall? - PullRequest
3 голосов
/ 31 мая 2011

Я разрабатываю API, который должен быть двоично-совместимым, по крайней мере, между mingw и msvc ++.До сих пор я ограничивался использованием функции, которая принимает и возвращает примитивные типы данных или указатели на POD-структуры с унифицированными элементами (т. Е. Все элементы одного типа, что должно снизить риск несовместимого заполнения).

В некоторых случаях было бы удобно возвращать структуры по значению, так что вызываемому абоненту не нужно сохранять временную копию.Поэтому возникает вопрос: безопасно ли передавать структуры по значению в / из функций stdcall, когда вызываемый объект компилируется компилятором, отличным от вызывающего?Это относится и к менее свежим версиям msvc и mingw?Я был бы более уверен, что это так, но я обнаружил, в этой теме обсуждается проблема в этой конкретной ситуации с соглашением о вызовах cdecl, которое, по-видимому, было решено только в mingw 4.6.

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

Использование struct, как не очень хороший вариант. Вам нужно использовать

# Pragma Pack

См. http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Fcompiler%2Fref%2Frnpgpack.htm

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

И убедитесь, что mingw соблюдает инструкцию по прагме.

0 голосов
/ 31 мая 2011

Я не знаю mingw, но если он может вызывать Win32 API, он может передавать структуры способом, совместимым с stdcall - поскольку многие Win32 API являются как stdcall, так и принимают структуры.

Martyn

...