Можете ли вы по-прежнему использовать переменные аргументы в C по-старому? - PullRequest
1 голос
/ 09 марта 2010

Чисто ради интереса, я переучиваю C после ... я не знаю ... 15 - 20 лет.

Кажется, я помню, что переменные аргументы были реализованы как простые макросы.

  • Кто-нибудь может вспомнить, кем они были?

Редактировать: Чтобы уточнить мой вопрос, я знаю, что они имели то же имя, что и va_list и т. Д., Но вы можете вспомнить фактическое определение макроса?

  • Будут ли они работать сегодня?

Ответы [ 5 ]

5 голосов
/ 09 марта 2010

Вы думаете о va_list, va_arg, va_start и va_end из stdarg.h ( ссылка на статью WP ). Они все еще работают просто отлично. : -)

1 голос
/ 09 марта 2010

Еще до стандартизации методы использования переменных аргументов были распространены. Стандарт C89 дал ... стандартизированный интерфейс, основанный на существующих практиках. Остатки этой практики все еще существуют на месте, например, <varargs.h> все еще присутствовал в Unix98: http://www.opengroup.org/onlinepubs/007908799/xsh/varargs.h.html (но больше не присутствует в текущей версии)

Реализация макросов всегда сильно зависела от системы (есть стеки, растущие в обоих направлениях, есть даже системы, использующие связанный список в качестве стека, положение различных вещей в кадре стека зависит от процессора и общего соглашения, на некоторых процессорах, - говорит Sparc, - сначала нужно сохранить регистры, требования к выравниванию могут вызвать проблемы, ...)

Если вы хотите знать, как будет выглядеть простая реализация, вот одна, в зависимости от предположений, вероятно, ложных (они не пытаются получить правильное выравнивание), а также, конечно, неудачных некоторых угловых случаев, даже когда предположения выполнены:

typedef void* va_list;
#define va_start(va, arg) va = (void*)((&arg)+1)
#define va_arg(va, type)  (va = (void*)(((type*)va) + 1), *((type*)va -1)
#define va_end(va)
1 голос
/ 09 марта 2010

Функции Variadic действительно обычно реализуются с использованием макросов. Они стандартизированы - см. эту статью в Википедии на эту тему. Фактические определения макросов зависят от архитектуры процессора, поскольку они должны играть в непереносимые игры со стеком вызовов.

0 голосов
/ 09 марта 2010

Трудно сказать, если бы ваша реализация их из далекого прошлого все еще работала, однако они в значительной степени совпадают с указанными другими, они просто перешли на стандарт заголовок (стандартным является оперативное слово).

То, что компилятор расширяет как встроенный, зависит от компилятора и от флагов, которые вы передаете ему при вызове.

Имейте в виду, что gcc не единственный компилятор C, но он (как и другие) соответствует c89 и c99.

0 голосов
/ 09 марта 2010

Переменные аргументы сегодня выполняются через интерфейс, описанный в <stdarg.h> - относительно того, как они были сделаны 15 лет назад, я действительно не могу сказать.

...