описание структур

Тема в разделе "LANGS.C", создана пользователем srm, 17 авг 2011.

  1. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Здравствуйте. Я на языке С описываю структуру

    Код (Text):
    1. typedef struct _A
    2. {
    3.     TCHAR*  a;
    4.     int b;
    5.     ...
    6. } A;
    И функции для работы с ней:
    Код (Text):
    1. void func_1(A*) {..}
    далее в программе мне необходимо работать с двумя типами структур A: для TCHAR = char и для TCHAR = wchar_t.
    Собственно вопрос: как так сделать, чтобы код генерировался под обе? В С++ для этих целей есть шаблоны. В С приходит на ум только выделить файлы в которых это описано в отдельную библиотеку и компилить с разными флагами...
     
  2. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    А разве TCHAR задаётся не на этапе компиляции?
     
  3. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    В этом вся проблема. Я должен юзать либо TCHAR = CHAR либо TCHAR = WCHAR, а мне нужно юзать и то и другое.
     
  4. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Передавайте в каждую функцию дополнительный параметр -- sizeof от типа, с которым работаете и действуйте в соответствии с этим? Это избавит от дублирования кода, ведь даже если бы это был шаблон -- каждая функция генерировалась бы дважды (для char и wchar_t).

    UPD: Или, как вариант, храните этот sizeof в самой структуре. Это избавит от лишнего параметра в функциях.
     
  5. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    union не то? чем не нравится? но лучше все таки шаблоны хотя думаю Вам С нужен...
    Код (Text):
    1. typedef struct _A
    2. {
    3.   union {
    4.     TCHAR*  ta;
    5.     CHAR*  a;
    6.    }
    7. ...
    8. } A;
     
  6. 999999

    999999 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2010
    Сообщения:
    4
    Может я ошибаюсь, но можно использовать указатель на void, как альтернативу шаблонам.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    h0t
    union хорош за тем исключением, что по объекту не ясно, что именно в нем лежит. Ну да, можно сделать дополнительный enum-параметр.

    srm
    Если у тебя может быть либо то либо то, то почему просто не сделать две разных структуры?
     
  8. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    я извращался через макросы...

    #define MegaFunc(CharType) void func(CharType *a){CharType *b; }
     
  9. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Потому что охота повторно использовать код.

    В общем-то всё не то.. Хочется так же, как с шаблонами в плюсах.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    srm
    Охота повторно использовать код - используй C++. Си деревянен как буратино.
     
  11. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Это понятно. Не я менеджер проекта.
     
  12. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Можно сделать модули-переходники для всех этих повторно используемых функций (если конечно код, который необходимо повторно использовать, реализован в отдельных файлах).

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

    Там, где нужно будет одновременное использование разных типов, никакой путаницы и ошибок не возникнет, отличаются как названия переходников, так и названия типов (в данном примере как суффиксы _char или _wchar_t, хотя можно было и покороче назвать).

    have_to_reuse.c - файл с кодом для повторного использования
    Код (Text):
    1. typedef struct _A
    2. {
    3.     TCHAR*  a;
    4.     int b;
    5.     ...
    6. } A;
    7.  
    8. void func_1(A*) {..}
    9. void func_2(A*) {..}
    implement_char.h - хедер переходников для char-варианта
    Код (Text):
    1. typedef struct _A_char
    2. {
    3.     char*  a;
    4.     int b;
    5.     ...
    6. } A_char;
    7. void func_1_char(A_char*);
    8. void func_2_char(A_char*);
    implement_char.c - тело переходников для char-варианта
    Код (Text):
    1. typedef char TCHAR;
    2. #include "have_to_reuse.c"
    3. void func_1_char(A_char* a) {func_1((A*)(void*)a);}
    4. void func_2_char(A_char* a) {func_2((A*)(void*)a);}
    implement_wchar_t.h - хедер переходников для wchar_t-варианта
    Код (Text):
    1. typedef struct _A_wchar_t
    2. {
    3.     wchar_t*  a;
    4.     int b;
    5.     ...
    6. } A_wchar_t;
    7. void func_1_wchar_t(A_wchar_t*);
    8. void func_2_wchar_t(A_wchar_t*);
    implement_wchar_t.c - тело переходников для wchar_t-варианта
    Код (Text):
    1. typedef wchar_t TCHAR;
    2. #include "have_to_reuse.c"
    3. void func_1_wchar_t(A_wchar_t* a) {func_1((A*)(void*)a);}
    4. void func_2_wchar_t(A_wchar_t* a) {func_2((A*)(void*)a);}
    using_both.c - совместное использование и того, и другого
    Код (Text):
    1. #include "implement_char.h"
    2. #include "implement_wchar_t.h"
    3.  
    4. struct A_char s;
    5. struct A_wchar_t sw;
    6.  
    7. int main()
    8. {
    9.   func_1_char(&s1);
    10.   func_2_wchar_t(&sw);
    11. }