Как я могу вызвать (не определить) функцию с переменным числом аргументов в C?

Есть ли способ сделать этот код короче?
4 голоса | спросил Adrian 23 J000000Friday10 2010, 22:07:26

6 ответов


0
Нет, нет хорошего способа сделать это.Смотрите здесь: http://c-faq.com/varargs/handoff.htmlВы можете написать макрос с вставкой токена, чтобы скрыть это поведение, но этот макрос будет не проще, чем этот код, поэтому его стоит писать, только если у вас есть несколько функций, таких как f (), где в противном случае вам пришлось бы дублировать этот оператор case.
ответил frankc 23 J000000Friday10 2010, 22:48:08
0
Я не знаю, как вы можете сделать ваш код короче, но я видел эту строку в вашем коде:При следующих вызовах функции ---- +: = 1 =: + ---- создается впечатление, что функция f принимает переменное число аргументов.Вы можете прочитать в википедии, что:Функции Variadic должны иметь хотя бы один именованный параметр, например,не допускается в C.Исходя из этого, может быть, заявление ---- +: = 3 =: + ---- доставляет вам неприятности?
ответил 23 J000000Friday10 2010, 22:10:45
0
На самом деле есть метод для вызова функции во время выполнения, если вы знаете соглашение о вызовах и какие параметры она получает.Это, однако, лежит за пределами стандартной области языка C /C ++.Для х86 ассемблера:Предполагая следующее:Вы знаете, чтобы подготовить все параметры для вашей функции в твердом буфере, точно так, как они будут упакованы в стек.Ваша функция не принимает /не возвращает объекты C ++ по значению.Тогда вы можете использовать следующую функцию:Возможно, вам придется настроить эту функцию в зависимости от используемого соглашения о вызовах.
ответил valdo 24 J000000Saturday10 2010, 01:28:11
0
Я отправлю здесь тот же ответ, что и на дублированный вопрос , но вы должны взглянуть на обсуждение там:Что такое либфи?Некоторые программы могут не знать во время компиляции, какие аргументы должны быть переданы в функцию.Например, интерпретатору можно сообщить во время выполнения о количестве и типах аргументов, используемых для вызова данной функции.«libffi» может использоваться в таких программах для обеспечения моста между программой-интерпретатором и скомпилированным кодом.Библиотека 'libffi' предоставляет переносимый высокоуровневый интерфейс программирования для различных соглашений о вызовах.Это позволяет программисту вызывать любую функцию, указанную в описании интерфейса вызова, во время выполнения.FFI обозначает Интерфейс Внешней Функции.Интерфейс сторонней функции - это популярное имя интерфейса, которое позволяет коду, написанному на одном языке, вызывать код, написанный на другом языке.Библиотека 'libffi' действительно предоставляет только самый нижний, машинно-зависимый уровень полнофункционального интерфейса сторонних функций.Над libffi должен существовать слой, который обрабатывает преобразования типов для значений, передаваемых между двумя языками.'libffi' предполагает, что у вас есть указатель на функцию, которую вы хотите вызвать, и что вы знаете количество и типы аргументов для ее передачи, а также тип возвращаемого значения функции.Историческая справкаlibffi, первоначально разработанный Энтони Грин (пользователь SO: anthony-green ), был вдохновлен библиотекой Gencall из Silicon Graphics.Gencall был разработан Джанни Мариани, который затем работал в SGI, с целью разрешения вызовов функций по адресу и создания кадра вызова для конкретного соглашения о вызовах.Энтони Грин усовершенствовал эту идею и распространил ее на другие архитектуры, соглашения о вызовах и открытый исходный код libffi.Вызов пау с либфиЯ думаю, что могу утверждать, что libffi - это портативный способ сделать то, что я просил, вопреки утверждению Антти Хаапалы, что такого способа нет.Если мы не можем назвать libffi переносимой технологией, учитывая, насколько она портирована /реализована в компиляторах и архитектурах и какой интерфейс соответствует стандарту C, мы тоже не можем назвать C или что-то еще переносимым.Информация и история извлечены из:https://github.com/atgreen/libffi/blob/master/doc/libffi.infohttp://en.wikipedia.org/wiki/Libffi
ответил pepper_chico 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2012 02:16:01 +0400 2012, 02:16:01
0
Вы можете проверить мой ответ на:Лучший способ сохранить va_list для последующего использования в C /C ++Что, кажется, работает, но пугает людей.Он не гарантированно кроссплатформенный или переносимый, но, по крайней мере, кажется работоспособным на нескольких платформах.;)
ответил Heath Hunnicutt 23 J000000Friday10 2010, 22:12:35
0
Должен ли f принимать переменное число указателей на long?Можете ли вы переписать его, чтобы принять массив и счетчик?
ответил nmichaels 23 J000000Friday10 2010, 22:18:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132