Musíte použít size
místo fmt
:
va_start(args, size);
Je to size
, nikoli fmt
, což je poslední parametr, který má explicitní název (na rozdíl od parametrů vararg, které nemají žádné názvy). Poslední pojmenovaný parametr musíte předat do va_start
aby mohl zjistit adresu v paměti, na které začínají parametry vararg.
second parameter of ‘va_start’ not last named argument
Co to znamená a jak to odstranit?
Vaše funkce má pojmenované parametry parent
, fmt
a size
. Specifikace C říká, že musíte vždy předat poslední pojmenovaný parametr do va_start
, kvůli kompatibilitě se staršími kompilátory. Takže musíte projít size
, nikoli fmt
.
(Ale s moderním kompilátorem by to mohlo fungovat tak jako tak)
Myslím, že je zde zmatek:většina lidí se zabývá pouze funkcemi podobnými prirf, které mají formát a varargs. a myslí si, že musí předat název parametru, který popisuje formát. nicméně va_start nemá nic společného s žádným formátem podobným printf. toto je pouze funkce, která vypočítává offset na zásobníku, kde začínají nepojmenované parametry.