Разделение повторяющегося кода - файл common.h - объявление функции с пользовательским параметром - PullRequest
0 голосов
/ 21 января 2020

Предполагая, что у меня есть файл A. c и файл B. c, я хотел бы переместить общий код в файл common.h и общий файл. c.

Файл A. c

typedef struct mystruct {
    long long nameA;    <--- different member
    struct astruct *next;
} MYSTRUC;

void free_table(MYSTRUC** tab) { <--- same code in A.c and B.c
    int i;
    MYSTRUC* current;
    MYSTRUC* tmp;
    for (i = 0; i < TSIZE; i++) {
        current = tab[i];
        while (current != NULL) {
            tmp = current;
            current = current->next;
            free(tmp);
        }
    }
    free(tab);
}

MYSTRUC** inittable() {
    int i;
    MYSTRUC **tab;
    ht = (MYSTRUC**) malloc( sizeof(MYSTRUC*) * TSIZE );
    for (i = 0; i < TSIZE; i++) tab[i] = (MYSTRUC*) NULL;
    return tab;
}
void otherA2() {uses nameA}

Файл B. c

typedef struct mystruct {
    long long nameB;   <---- different member
    struct bstruct *next;
} MYSTRUC;

void free_table(MYSTRUC** tab) {  <--- same code in A.c and B.c
    int i;
    MYSTRUC* current;
    MYSTRUC* tmp;
    for (i = 0; i < TSIZE; i++) {
        current = tab[i];
        while (current != NULL) {
            tmp = current;
            current = current->next;
            free(tmp);
        }
    }
    free(tab);
}

MYSTRUC** inittable() {
    int i;
    MYSTRUC **tab;
    ht = (MYSTRUC**) malloc( sizeof(MYSTRUC*) * TSIZE );
    for (i = 0; i < TSIZE; i++) tab[i] = (MYSTRUC*) NULL;
    return tab;
}

void otherB2() {uses nameB}

Если я поставлю объявление free_table () в common.h компилятор будет жаловаться на неизвестный тип MYSTRU C. Я могу создать файлы Ah и Bh и переместить туда MYSTRU C (из A. c) и MYSTRU C (из B. c). Но это не решит мою проблему. Версия STRUCT из второго заголовка будет охватывать версию из первого заголовка.

File common.h 
#include "A.h" <--- wrong
#include "B.h" <--- wrong

void free_table(MYSTRUC** str){ <--- same code in A.c and B.c
....
}

Как мне решить эту ситуацию? Возможно ли это сделать без шаблонов?

1 Ответ

0 голосов
/ 21 января 2020

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

Спасибо @klutt, @Fire Lancer, @WhozCraig.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...