Вызов различных функций с использованием прямого доступа к параметрам в C

Недавно я наткнулся на эту страницу. И меня особенно заинтересовал раздел, посвященный прямому доступу к параметрам.

Мне просто интересно, есть ли способ выполнить только одну из функций в зависимости от значения n в следующей строке:

printf("%n$p", func1, func2, func3 .. funcN);

где func1,.. имеют подпись как int func1(), int func2() и т. д. Это ограничение, так как я мог бы также захотеть иметь функцию, возвращающую void.

В приведенной выше строке печатается только адрес функции; Функция не вызывается..

Я даже пытался использовать ',' (оператор запятой), чтобы добиться этого; но в этом случае будут вызваны все функции в списке, и будет напечатан результат, соответствующий 'n'.

Есть ли способ выполнить функцию внутри printf(..)?

Спасибо.


person UltraInstinct    schedule 27.12.2009    source источник
comment
Зачем это делать, а не просто вызывать функцию и передавать результат в printf?   -  person Marcelo Cantos    schedule 27.12.2009


Ответы (2)


Нет, вы не можете сделать это с помощью printf, так как printf не поддерживает вызов параметров указателя функции.

Но вы можете написать свою собственную функцию, которая делает это с помощью stdarg:

#include <stdarg.h>

void invoke_and_print(unsigned int n, ...)
{
    va_list ap;
    va_start(ap, n);

    int (*fp)(void) = NULL;
    while (n-- != 0)
    {
        fp = va_arg(ap, int (*)(void));            
    }
    va_end(ap);

    printf("%d\n", (*fp)());
}
person R Samuel Klatchko    schedule 27.12.2009

Не в одну строку, а что-то вроде:

typedef int (*fp)();
fp[] thefuncs = {func1, func2, func3, func4};
printf("%d", fp[n]());

вроде начало. Если функции возвращают void, а не int, что вы думаете о печати?

person Alex Martelli    schedule 27.12.2009
comment
Да! таким образом вы можете достичь этой цели! Но мой вопрос в том, как я могу сделать это, используя прямой доступ к параметрам. - person UltraInstinct; 27.12.2009
comment
Ответ на это: нет, вы не можете сделать printf функции вызова за вас. Зачем вам прямой доступ к параметрам? Это не что-то волшебное, и даже если бы printf мог делать то, что вы хотите, это не было бы более эффективным или более читабельным, чем приведенное выше решение. - person jamesdlin; 27.12.2009