Передача переменных аргументов в C

Кто-нибудь знает, как переменные аргументы передаются в классическом C? Сегодня я провел некоторую отладку, и большинство обычных аргументов передаются через стек. Однако кажется, что это не относится к переменным аргументам. Хранятся ли эти параметры где-то еще, как постоянные строки?

Заранее спасибо!


person Florian Greinacher    schedule 31.03.2011    source источник


Ответы (4)


Они очень часто передаются по стеку. Вам нужны спецификации ABI для платформы, которую вы используете.

Для платформы AMD64 посмотрите, например, здесь.

person Prof. Falken    schedule 31.03.2011
comment
Я тоже этого ожидал. Но я столкнулся с ситуацией, когда я не мог найти переменные аргументы в окне памяти Visual Studio... Есть ли какая-либо документация по передаче параметров в C? - person Florian Greinacher; 31.03.2011
comment
@ Флориан Грейнахер, это странно. Я не знаю, что сказать дальше, кроме как найти ABI docs для Windows. - person Prof. Falken; 31.03.2011
comment
Спасибо, я думаю, это поможет найти ответ :) - person Florian Greinacher; 31.03.2011

Это зависит от платформы. /usr/include/stdarg.h — это то место, с которого можно начать искать подробности.

person geekosaur    schedule 31.03.2011
comment
В Юниксе да. На других платформах stdarg.h может быть в другом месте. +1, однако. - person Fred Foo; 31.03.2011
comment
Хотя технически это верно, также верно и то, что вам будет трудно найти множество платформ, на которых они НЕ передаются в стеке. - person Prof. Falken; 31.03.2011
comment
@Amigable: я смутно припоминаю, что SPARC делал некоторые интересные вещи с окном регистрации для varargs, но это было давно, и у меня больше нет доступа к нему. - person geekosaur; 31.03.2011
comment
Но Win32 не такая уж особенная, не так ли :) - person Florian Greinacher; 31.03.2011
comment
@Florian: см. предыдущий комментарий, в котором говорится, что некоторые вещи передаются в регистрах на x86-64. Однако x86 будет состоять только из стека: у него недостаточно регистров, чтобы даже рассмотреть их использование для передачи аргументов. - person geekosaur; 31.03.2011

Вы имели в виду списки аргументов переменной длины?

person Sadique    schedule 31.03.2011
comment
Спасибо за ответ, но я знаю, как их использовать. Мой вопрос в том, как они передаются вызываемому. - person Florian Greinacher; 31.03.2011

Вот забавный трюк

void func(type* values) {
    while(*values) {
        x = *values++;
        /* do whatever with x */
    }
}

func((type[]){val1,val2,val3,val4,0});
person Rose Perrone    schedule 27.11.2011