Как правильно написать макрос?

Есть 3 основных #define: LIST_SIZE_T , LIST_SIZE_MIN , LIST_SIZE_MAX

нужно что бы при задании типа в ..._T макросы MIN и MAX автоматически определялись с нужным числом и длиной.

К примеру есть тип int и есть макросы INT_MIN И INT_MAX, нужно сделать тоже самое при том, что кастомный тип будет повторять существующие стандартные и что-бы _MIN и _MAX не выставлять вручную.

Мой, естественно неработающий, код:

#include <stdint.h>

#define LIST_SIZE_T unsigned
#define LIST_SIZE_MIN 0

#define CONCAT(X, Y, Z) X##Y##Z 
#define UINT_MAX(X) CONCAT(UINT, X, _MAX)
#define LIST_SIZE_MAX UINT_MAX(sizeof(LIST_SIZE_T)*8)

P.S. Тип, задаваемый в ..._T, всегда целочисленный без знаковый.


Ответы (1 шт):

Автор решения: Serge3leo

Если всегда целочисленный беззнаковый, то можно по-простому, без многоэтажных константных выражений:

#if !defined(LIST_SIZE_T) // Для тестирования: сс -DLIST_SIZE_T="unsigned char"
    #define LIST_SIZE_T unsigned short
#endif

// Содержимое my_list.h 
#if !defined(MY_LIST_H_0132_)
#define MY_LIST_H_0132_

#if !defined(LIST_SIZE_T)
    #error "LIST_SIZE_T должен быть определён до #include \"my_list.h\""
#endif

#define LIST_SIZE_MIN 0
#define LIST_SIZE_MAX ((LIST_SIZE_T)-1)

struct my_list_h_0132_ {
    char assert[LIST_SIZE_MIN < LIST_SIZE_MAX ? 0 : -1];
};

#endif // !defined(MY_LIST_H_0132_)

// Тест
#include <stdio.h>

#define MKSTR(D) #D
#define STR(D)  MKSTR(D)

int main()
{
    printf("LIST_SIZE_T=%s\n", STR(LIST_SIZE_T));
    printf("sizeof(LIST_SIZE_T)=%zu\n", sizeof(LIST_SIZE_T));
    printf("LIST_SIZE_MAX=0x%llx\n", (unsigned long long)LIST_SIZE_MAX);
    return 0;
}
→ Ссылка