У нас есть довольно нормальная функция стиля 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?Очень хотелось бы получить указатель на соответствующую документацию!