Здравствуйте. Я на языке С описываю структуру Код (Text): typedef struct _A { TCHAR* a; int b; ... } A; И функции для работы с ней: Код (Text): void func_1(A*) {..} далее в программе мне необходимо работать с двумя типами структур A: для TCHAR = char и для TCHAR = wchar_t. Собственно вопрос: как так сделать, чтобы код генерировался под обе? В С++ для этих целей есть шаблоны. В С приходит на ум только выделить файлы в которых это описано в отдельную библиотеку и компилить с разными флагами...
В этом вся проблема. Я должен юзать либо TCHAR = CHAR либо TCHAR = WCHAR, а мне нужно юзать и то и другое.
Передавайте в каждую функцию дополнительный параметр -- sizeof от типа, с которым работаете и действуйте в соответствии с этим? Это избавит от дублирования кода, ведь даже если бы это был шаблон -- каждая функция генерировалась бы дважды (для char и wchar_t). UPD: Или, как вариант, храните этот sizeof в самой структуре. Это избавит от лишнего параметра в функциях.
union не то? чем не нравится? но лучше все таки шаблоны хотя думаю Вам С нужен... Код (Text): typedef struct _A { union { TCHAR* ta; CHAR* a; } ... } A;
h0t union хорош за тем исключением, что по объекту не ясно, что именно в нем лежит. Ну да, можно сделать дополнительный enum-параметр. srm Если у тебя может быть либо то либо то, то почему просто не сделать две разных структуры?
Потому что охота повторно использовать код. В общем-то всё не то.. Хочется так же, как с шаблонами в плюсах.
Можно сделать модули-переходники для всех этих повторно используемых функций (если конечно код, который необходимо повторно использовать, реализован в отдельных файлах). К сожалению, таким путем похоже не удастся повторно использовать объявление структур для разных типов чара, поэтому придется их продублировать в конкретном виде. Но полностью повторное использование функций. Там, где нужно будет одновременное использование разных типов, никакой путаницы и ошибок не возникнет, отличаются как названия переходников, так и названия типов (в данном примере как суффиксы _char или _wchar_t, хотя можно было и покороче назвать). have_to_reuse.c - файл с кодом для повторного использования Код (Text): typedef struct _A { TCHAR* a; int b; ... } A; void func_1(A*) {..} void func_2(A*) {..} implement_char.h - хедер переходников для char-варианта Код (Text): typedef struct _A_char { char* a; int b; ... } A_char; void func_1_char(A_char*); void func_2_char(A_char*); implement_char.c - тело переходников для char-варианта Код (Text): typedef char TCHAR; #include "have_to_reuse.c" void func_1_char(A_char* a) {func_1((A*)(void*)a);} void func_2_char(A_char* a) {func_2((A*)(void*)a);} implement_wchar_t.h - хедер переходников для wchar_t-варианта Код (Text): typedef struct _A_wchar_t { wchar_t* a; int b; ... } A_wchar_t; void func_1_wchar_t(A_wchar_t*); void func_2_wchar_t(A_wchar_t*); implement_wchar_t.c - тело переходников для wchar_t-варианта Код (Text): typedef wchar_t TCHAR; #include "have_to_reuse.c" void func_1_wchar_t(A_wchar_t* a) {func_1((A*)(void*)a);} void func_2_wchar_t(A_wchar_t* a) {func_2((A*)(void*)a);} using_both.c - совместное использование и того, и другого Код (Text): #include "implement_char.h" #include "implement_wchar_t.h" struct A_char s; struct A_wchar_t sw; int main() { func_1_char(&s1); func_2_wchar_t(&sw); }