2015-01-20 2 views
0

Это мой typedef structнужно удалить дополнительный аргумент при вызове функции

//command look up table structure 
typedef struct 
{ 
    int commandCode; 
    int (*process_command) (...); 
}cmdTableStruct; 

Использование int (*process_command) (...); нужно вызвать соответствующую функцию, которую я присваиваемое, что если матч с кодом команды.

ex.

static cmdTableStruct cmdTable[]= 
{ 
{ 1123,testFunc}, 
// more command in same manner 
}; 

здесь он будет вызывать testFunc функцию, если команда кода 1123 и аргумент этой функции только один. То же самое он будет вызывать разные функции, но тип аргумента отличается, а аргумент - один.

Теперь с помощью int (*process_command) (...); в stuct определение он дает мне ошибку, как

Error: #xx: expected a type specifier 

я могу устранить эту ошибку, добавив один известный аргумент типа

как

int (*process_command) (int x,...); 

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

есть предложения?

+6

Эллипсис ('...') означает * ноль больше * аргументов. Функция, принимающая переменное число аргументов, должна * всегда * иметь хотя бы один действительный аргумент. Вот как работает система с переменными аргументами в C. Для отличного примера рассмотрим, например, ['printf'] (http://en.cppreference.com/w/c/io/fprintf), он объявлен как' int printf (const char * format, ...) ', и у вас все еще нет чтобы обеспечить больше, чем исходная строка. –

+0

Для работы Varargs требуется хотя бы один именованный параметр, поэтому я думаю, что все. – Quentin

+0

@JoachimPileborg да, но все мои функции ожидают только одного аргумента и имеют разные типы. –

ответ

1

проводки мой комментарий в качестве ответа, и можно считать это:

typedef struct 
{ 
    int commandCode; 
    int (*process_command) (void *ptr); 
}cmdTableStruct; 

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

+0

Спасибо ..также возможно использование 'void cb (va_list args)' в соответствии с примечанием @WhozCraig в комментарии. –

+0

В вашем случае u всегда ожидает один аргумент. так зачем считать va_list? Я не вижу причин использовать va_list, поскольку ваш номер аргумента является постоянным. –

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