Создание функции для выбора интерфейса в зависимости от аргументов

Я хочу сделать функцию для выбора другой в C, возможно, этот C-псевдокод может помочь немного прояснить, что я хочу:

void set_method(const char *method)
{
    // Check if the method is serial_port
    if (strcmp(method, "serial_port") == 0)
    {
        // assign the alias "print" to serial_print
        // something like defing here a function like this:
        // print(const char *print) { serial_print(print); }

        print(const char *print) = serial_print(const char *message)
    } 
    else if (strcmp(method, "graphical_tty") == 0)
    {
        // The same that serial_port case but with graphical_tty_print
    } 
    else
    {
        // Error
    } 
} 

Цель состоит в том, чтобы назначить псевдоним функции, если условие выполнено, как я могу это сделать?

Для этого я использую отдельную реализацию C, скомпилированную с помощью clang.

2 ответа

Решение

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

typedef int (*PrintFunctionType)(const char*);

int serial_print(const char *message) { printf("in serial: %s\n", message); return 0; }
int tty_print(const char* message) { printf("in tty: %s\n", message); return 0; }


PrintFunctionType print = serial_print;  // default

void set_method(const char *method)
{
    // Check if the method is serial_port
    if (strcmp(method, "serial_port") == 0)        {
        print  = serial_print;
    }
    else if (strcmp(method, "graphical_tty") == 0)        {
        print = tty_print;
    }
    else       {
        // Error
    }
}

int main() {
    print("Hello!");
    set_method("graphical_tty");
    print("Hello!");
}

//Output:
//
//in serial: Hello!
//in tty: Hello!

Надеюсь, поможет:-)

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

typedef int (*fptr)(int);

fptr fa[5];
int f1(int);
int f2(int);    
fa[0]=f1;
fa[1]=f2;
....

Затем на основании сравнения назовите любой из них. И передайте этот массив функции и вызовите его элементы, или даже вы можете сделать его глобальным массивом, а затем использовать его в функции.

void set_method(const char *method, fptr fp[]){
    if (strcmp(method, "serial_port") == 0){
        (*fp[0])();
    }
    ...
}
Другие вопросы по тегам