Как правильно написать макрос?
Есть 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;
}