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 argumentCo 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.