[Development] QMetaType and type aliases for primitive types
Thiago Macieira
thiago.macieira at intel.com
Sat May 8 17:47:11 CEST 2021
On Saturday, 8 May 2021 00:48:51 PDT Alberto Mardegan wrote:
> Hi there!
> I'm struggling to understand what's going on with types being
> marshalled onto D-Bus, and I'd like to understand if what I'm seeing is
> a but with the Qt version I'm using (Qt 5.12.7 + some patches), an issue
> with the compiler, or just the expected behaviour.
>
> The problem is that QtDBus fails to send some messages:
>
> QDBusMarshaller: type `long' (32) is not registered with D-BUS. Use
> qDBusRegisterMetaType to register it
Qt doesn't like long. This has nothing to do with QtDBus.
Don't use long.
> What happens is that I'm creating a QVariant and writing a int64_t
> inside it, and for some reason:
>
> 1) QMetaType resolves that to "long", so the QVariant ends up holding a
> "long", and not a "int64_t".
Correct. So don't use long. Use qint64, which is a long long.
> I'm not sure how to proceed. I really would like to continue using the
> standard C types, because they are part of a D-Bus API and their length
> should not change depending on the CPU architecture.
Yeah, this is the problem.
And the problem is that they *do* depend on the CPU architecture. long changes
size depending on OS and pointer size. As far as I am concerned, the fact that
int64_t, size_t and ptrdiff_t sometimes (not always!) use long is a
misfeature. Those decisions were made in the early 90s by C, before long long
existed in the standard, and before C++ with overloads and ABI became an
important thing. So we carry some legacy.
It gets even worse: on some architectures, ptrdiff_t can be neither int32_t
nor int64_t, despite matching the size of one of those two; ditto for size_t
and/or uintptr_t versus uint32_t and uint64_t.
> Interestingly, I'm seeing this on amd64 only; it seems that on armhf
> everything is working fine. Could it be a bug with the compiler?
No, that's because there the compiler defines int64_t as a different type
(long long) because long is only 32-bit.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel DPG Cloud Engineering
More information about the Development
mailing list