2013-05-28 2 views
1

У меня динамический ADT массива, тип которого элемент является ничтожным *Как повторно использовать один и тот же фрагмент кода C с различными typedef в одной программе?

// In dyn_array.h 
typedef void* element; 
void append(array *a, element e); 
inline void set(array *a, int i, element e); 
... 
// dyn_array.c contains the implementation 

и используются во многих частях моей программы. Когда я добавляю новые функции в программу, теперь мне нужен динамический массив с элементом int вместо void *. Я знаю, что одним из решений может быть создание dyn_arrayi.h и dyn_arrayi.c, содержимое которых почти идентично dyn_array.h и dyn_array.c, за исключением оператора typedef и имен функций. Но это не кажется мне изящным решением, потому что я, очевидно, бессмысленно повторяю.

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

+1

element is void * now, если у вас есть целое число и вы хотите использовать ту же функцию, вы можете передать & integer вместо void *. –

+0

Предлагаю вам прочитать это сообщение: http://stackoverflow.com/questions/11164621/templating-in-c-using-the-preprocessor –

+0

@Dayalrai К сожалению, в моем реальном коде я действительно хочу сохранить структуру. Спасибо, что упомянул об этом ;-) –

ответ

1

Это то, что C++ лучше поддерживает, чем C. Не могли бы вы вместо этого рассмотреть C++?

Во всяком случае, в C вы могли бы сделать это: первый определенный dyn_array_generic.c и т.д., используя ARRAY_TYPE вместо void* и добавление функции суффикса, определенный в FUNC_POSTFIX для каждого имени функции, используя подходящий макрос, то в dyn_array.c и т.д. сделать это:

#define ARRAY_TYPE void* 
#define FUNC_POSTFIX 
#include "dyn_array_generic.c" 
#undef FUNC_POSTFIX 
#undef ARRAY_TYPE 

и dyn_arrayi.c и т.д. сделать это:

#define ARRAY_TYPE int 
#define FUNC_POSTFIX _int 
#include "dyn_array_generic.c" 
#undef FUNC_POSTFIX 
#undef ARRAY_TYPE 

#undef не строго необходимо, я просто думаю, что это понятнее.

0

Уже пробовал макросы?

Вы могли бы попробовать простой #ifdef

#define DEFINE_MY_TYPE(tp) \ 
typedef (tp) elem; 

#define FUNCTION_APPEND(func_name) \ 
void func_name(array *a, elem e); 


#define FUNCTION_SET(func_name) \ 
void func_name(array *a, elem e); 

#ifdef USE_INT 
DEFINE_MY_TYPE(int) 
#elif USE_VOID 
DEFINE_MY_TYPE(void *) 
#endif 

Вы можете определить целую функцию с помощью макросов.

#define FUNCTION_APPEND(func_name) \ 
void func_name(array *a, elem e){ \ 
    int a,b,c, \ 
    ...  \ 
    return 0; \ 
} 

FUNCTION_APPEND(append_int) 

int main (int argc, char *argv[]){ 
{ 
    .... 
    append_int(NULL, 0); //using function defined with MACRO 
    ... 
    return 0; 
} 

Или, в зависимости в том, как вы планируете использовать эти макросы, вы можете попробовать технику Macro X (http://en.wikipedia.org/wiki/X_Macro), но Google для получения дополнительной информации, прежде чем на самом деле использовать его.

+0

FUNCTION_APPEND (append_int) и FUNCTION_APPEND (append_voidp) генерирует точно такой же код, кроме имени функции. Это означает, что они используют один и тот же тип «elem». И поскольку переопределение typedef является незаконным, я не могу заставить обе версии работать одновременно с этим подходом. Я прав? :-) –

+0

Да, вы правы. Но вы можете добавить второй аргумент в макрос, чтобы заменить тип элемента. Если вы хотите использовать один и тот же typedef внутри своего кода, просто создайте объединение этих типов. –

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

  • Нет связанных вопросов^_^