Я пытаюсь выяснить, что стоит за макросами va_start(), va_arg(). Код ниже работает хорошо.c переменные функции путаницы
#include <iostream>
#include <cstdarg>
void f(double a, double b, ...)
{
va_list arg;
va_start(arg, b);
double d;
while((d = va_arg(arg, double)) != 0)
{
std::cout << d << '\n';
}
}
int main(int argc, char *argv[])
{
f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 0.0);
return 0;
}
Как я ожидал, что он дал такой результат: 3 4 5 6 7 8 9. Тогда я нашел определение, что макросы (в Интернете, потому что мой заголовок stdarg.h загадочно - он определяет макросы va_arg (v, l), как _builtin_va_arg (v, l), последнее не определено в нем, а stdarg.h ничего не содержит, так же как в некоторой библиотеке ???). Тем не менее, вместо "cstdarg" я писал:
typedef char* va_list;
#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1) &~(sizeof(int)-1))
#define va_start(ap,v) \
(ap = (va_list)&v + _INTSIZEOF(v))
#define va_arg(ap,t) \
(*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
#define va_end(ap) (ap = (va_list)0)
Выход стал странно, такие как 1 -0,0409377 -0,0409377 4.88084e-270 4.85706e-270 9. Я думал, что вариационные параметры расположены рядом с последним объявленным параметром, но, по-видимому, существует более сложная ситуация. Я был бы очень доволен, если кто-нибудь представит, где я ошибаюсь или что на самом деле происходит там.
Я не упоминал об этом раньше, но рукописные макросы отлично работают с типом int, то есть все параметры помещаются как ожидалось относительно последнего заданного аргумента. В случае двойного типа параметры также находятся в стеке, но нечетным образом, а именно я мог бы получить правильный результат, добавляя начальные шесть к указателю на последний аргумент. Это какая-то прокладка? Более того, я обнаружил, что определенные аргументы существуют дважды.Вы можете видеть, что он ставит указатель на первый аргумент. Вы получите их, затем четыре цифры, а затем все параметры по одному. – Nephew
Я понимаю, что это далеко от полезности, чтобы это знать, но все же любопытно. Благодарю. – Nephew