Существуют ли шаблоны на языке программирования C?

Я пишу реализацию связанного списка в C и хотел бы использовать функцию языка, эквивалентную шаблонам C ++, чтобы упростить мою работу.

Существует ли такая особенность?

6
nl ja de
Большое спасибо
добавлено автор user1722022, источник
Что вы подразумеваете под «шаблоном» в этом контексте?
добавлено автор cnicutar, источник
Шаблоны - это особенность языка программирования C ++, который позволяет функциям и классам работать с универсальными типами.
добавлено автор user2166576, источник

4 ответы

C не имеет шаблонов, таких как C ++, хотя вы можете добиться чего-то подобного с «умным» (или WTFey, в зависимости от того, как вы его смотрите) с использованием макросов #define .

Однако посмотрите, как, например, GLib делает это для отдельных списков или дважды связанных списков .

6
добавлено
+1 для "или WTFey"
добавлено автор Brendan, источник

Шаблоны - это функции C ++, но если вы хотите независимую от типа реализацию одно- или двусвязного списка, это можно сделать с помощью макросов или просто сохранить указатели void * в вашей структуры.

Конечно, в Интернете есть много таких реализаций. @MohamedKALLEL и @hyde уже привел примеры из ядра Linux и из GLib, я хотел бы просто добавить примечание о небольшой небольшой библиотеке <сильный> uthash .

Он реализует хэш-таблицу в C, но также имеет utlist.h , который реализует одиночные и двусвязные (и даже круговые) списки полностью для макросов. То есть вы можете просто взять этот файл, включить его и либо использовать эти макросы как есть, либо изменить его для своих нужд. Также приятно, что вы можете использовать любую из своих структур данных: для этого нужно иметь next указатель (и prev , если он связан дважды).

P.s. Но всегда помните, когда используете макросы: с большой силой приносит большую ответственность . Макросы мощные, но могут стать чрезвычайно опасными и нечитаемыми. Осторожно!

4
добавлено

Да, list.h . И это круговой связанный список:

следующая ссылка содержит пример о том, как ее использовать.

list.h содержит все функции, связанные с управлением круговым связанным списком, таким как определение, добавление в голову, добавление в хвост, удаление, функция foreach для просмотра кругового связанного списка ...

3
добавлено
@unwind: Я знаю, что list.h используется в ядре linux. но в ссылке, которую я даю в этом ответе для list.h, это еще один дистрибутив list.h, и он работает в пользовательском пространстве Linux и переносится. Я использую его во всем моем приложении для пользовательского пространства, которое я разрабатываю, и он отлично работает.
добавлено автор MOHAMED, источник
@unwind См. этот параграф в ссылке, которую я даю в ответе, в качестве примера isis.poly .edu/kulesh/stuff/src/klist С очень небольшими изменениями (удаление аппаратной предварительной выборки элементов списка) мы также можем использовать этот список в наших приложениях. Доступная версия этого файла доступна здесь для загрузки.
добавлено автор MOHAMED, источник
@unwind Пожалуйста, в следующий раз не делайте судью перед проверкой
добавлено автор MOHAMED, источник
@MohamedKALLEL: цитата никак не затрагивает комментарий пользователя unwind.
добавлено автор Lightness Races in Orbit, источник
Это ответ, специфичный для ядра Linux, это не общий ответ о том, как он «в C». Мне показалось странным, что он был проголосован.
добавлено автор unwind, источник

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

#include 
#include 
#define INT 0
#define STR 1
void foo( int type, ... )
{
    va_list ap;
    int i;
    char *s;
    va_start( ap, type );
    switch( type ) {
    case INT:
        i = va_arg( ap, int );
        printf( "INT: %i\n", i );
        break;
    case STR:
        s = va_arg( ap, char * );
        printf( "STR: %s\n", s );
        break;
    default:
        break;
    }
    va_end( ap );
}
#define SWAP( type, a, b ) {                    \
        type t;                                 \
        t = a;                                  \
        a = b;                                  \
        b = t;                                  \
    }
int main( void )
{
    foo( INT, 3 );
    foo( STR, "baz" );
    int ia = 0, ib = 3;
    SWAP( int, ia, ib );
    printf( "%i %i\n", ia, ib );
    float fa = 0.5, fb = 3.14;
    SWAP( float, fa, fb );
    printf( "%f %f\n", fa, fb );
    return 0;
}

будет производить выход

INT: 3
STR: baz
3 0
3.140000 0.500000
1
добавлено