2016-07-14 3 views
-3

У меня есть функция C, которая принимает настраиваемую структуру и переменное количество аргументов с разными типами (ints/strings/other custom structure ...). Из-за структуры функция может определить, для какого типа каждый аргумент, для его обработки.Передача переменных параметров функции

void doStuff(MyStruct *S,...){ <function code> } 

Теперь мне нужна другая функция, которая может передавать число постоянных аргументов «n» в «doStuff». То есть что-то вроде этого:

void useDoStuff(Mystruct *S, int n){ //lets say n=4 
    va_list arguments; 
    int i; 
    for(i = 0 ; i < n ; i++){ 
     if(i%2) arguments.add(6); //example condition for the arguments 
     else arguments.add("Hello"); 
    } 
    doStuff(S, arguments); // doStuff(S, "Hello", 6, "Hello", 6); 
} 

Естественно, что это не будет работать, потому что va_list не может быть использован, как это (использовал его только грубо «визуализировать» то, что нужно). К сожалению, ни структура, ни функция doStuff не могут быть изменены, и мне нужно найти обходной путь. Существует ли такое обходное решение?

+6

Это не C, это C++ (C не имеет явных ссылок). Это проблема XY. Почему вы пытаетесь создать гетерогенный список аргументов? Что такое _actual_ определение 'doStuff'? – Tim

+0

Да, вы правы, нет ссылок на C (не знаю, почему я использовал их вместо указателей в примере). В любом случае, на самом деле не имеет значения, что делает makeStuff, но я должен передать неизвестное количество постоянных аргументов, которые передают определенные условия. –

+0

Цитата: «Естественно, это не сработает, потому что va_list нельзя использовать как это (использовал его только для того, чтобы грубо« визуализировать », что нужно)». Я имею в виду ... у va_list есть функция «добавить»? - нет. –

ответ

2

C не определяет механизм динамического построения списков переменных аргументов. Обычно компилятор преобразует вызовы varargs в обычные вызовы функций, используя механизмы реализации для обработки списка аргументов по обе стороны вызова. Для этого компилятор должен знать, каковы фактические аргументы для каждого вызова.

Если все функции в конечном счете проходят через функцию varargs, то все ваши варианты являются вариантами написания нескольких альтернативных вызовов функций и динамического выбора одного из них для выполнения или выполнения работы с помощью нескольких вызовов функций. Возможно, это будет возможно.

Учитывайте, однако, может ли быть учтена соответствующая часть поведения функции varargs, чтобы она могла осуществляться непосредственно. Вы могли бы, скажем, предоставить один или несколько альтернативных фронтов, которые принимают данные для использования в виде массива структур вместо переменных.

Смежные вопросы