Я пытаюсь понять, как variadi c работает в C. Я не нашел ответа в Google, поэтому здесь я.
Когда мы передаем аргумент функции, она создает копию переменной и сохраняет ее в стеке. Чтобы проверить это утверждение, я написал этот фрагмент кода:
void func(uint32_t a, uint32_t b, uint32_t c) {
printf("%d == %d\n", a, *(&a - 0));
printf("%d == %d\n", b, *(&a - 1));
printf("%d == %d\n", c, *(&a - 2));
}
// somewhere in the code
func(1, 2, 3);
Вывод:
1 == 1
2 == 2
3 == 3
Итак, работает, аргументы хранятся в обратном порядке. Давайте перепишем эту функцию с помощью многоточия.
void func(uint32_t a, ...) {
printf("%d\n", *(&a - 0));
printf("%d\n", *(&a - 1));
printf("%d\n", *(&a - 2));
}
Вывод:
1
0
0
Как видите, поведение отличается. Хорошо, тогда я должен заглянуть внутрь <stdarg.h>
( здесь , например)? Давайте сделаем это!
#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
О, круто, это просто макрос, который вызывает __builtin_va_*
функции, определенные в ... в компиляторе ?
Итак , мои вопросы: - Где в памяти хранятся эти аргументы? Это определенное компилятором место или нет?