Эти 2 соглашения используются вместе в режиме компиляции x86?
Нет. Откуда вы взяли эту идею? Каждое соглашение о вызове отличается, и любая данная функция может использовать только одно соглашение о вызове за раз. Не только это, но и fastcall
не является стандартизованным. Различные 32-битные компиляторы реализуют его по-разному, если вообще, поэтому его нельзя использовать для переносимого кода. Единственными стандартными переносными соглашениями о вызовах в 32 бит являются cdecl
и stdcall
.
А для 64-битной компиляции нет cdecl + fastcall? Совместимость с AMD 64 ABI?
Да. В 64-битной версии существует только одно универсальное соглашение. 32-битные вызовы, используемые явно в коде, игнорируются.
Если да, то как отложить между stdcall и cdecl в режиме 64 бит?
У вас нет. Потому что их не существует.