Автоматическое преобразование структуры в указатель при вызове функции - PullRequest
1 голос
/ 22 февраля 2011

У нас есть довольно нормальная функция стиля printf в нашем проекте, с модификацией, что формат %g означает печать GUID вместо обычного типа с плавающей точкой.В нашем случае GUID выглядит примерно так:

struct guid {
  uint32_t  Data1;
  uint16_t  Data2;
  uint16_t  Data3;
  uint8_t   Data4[8];
};

В действительности, функция печати ожидает передачи указателя на GUID, в отличие от самой структуры:

struct guid myGuid = { 0x867FD1E7, 0x9AA7, 0x472A, { 0xAA, 0x56, 0xF2, 0xDA, 0x66, 0x62, 0xCD, 0x4D } };
print("%g", &myGuid);

Однако есть несколько мест в исходной базе, где по какой-то причине передается весь guid:

print("%g", myGuid);

Этот стиль вызова, кажется, хорошо работает с MSVC2003 - есть ли какое-то требование ABI, которое предъявляеткомпилятор переводит этот стиль вызова функции, чтобы фактически передать указатель за кулисы?При переносе этой кодовой базы для использования clang / llvm она, конечно, не делает то же самое.

Может кто-нибудь объяснить, почему вторая версия вызова работает с MSVC?Очень хотелось бы получить указатель на соответствующую документацию!

1 Ответ

1 голос
/ 22 февраля 2011

Я думаю, что нашел какое-то пояснение по MSDN :

Любой аргумент, который не помещается в 8 байтов или не равен 1, 2, 4 или 8 байтов, должны быть переданы по ссылке.

Похоже, пришло время исправить лязг!

...