Вот пример моих макросов:
#define STR(val) #val
#define STRX(val) STR(val)
#define LINE_ STRX(__LINE__)
#define SRC_STR __FILE__":"LINE_
#define SRC_STRN SRC_STR"\n"
#define PRINT_IF(cond) ((cond)&&(printf("\""#cond"\" is true: "SRC_STRN)>=0))
#define PRINT_IFNOT(cond) ((!(cond))&&(printf("\""#cond"\" is false: "SRC_STRN)>=0))
#define PRINT_IFN PRINT_IFNOT
#define PRINT_IFEQ(a,b) PRINT_IF(a==b)
#define PRINT_FMT(val,fmt) printf(#val" = "#fmt": "SRC_STRN,val)
#define PRINT_INT(i) PRINT_FMT(i,%d)
#define PRINT_LONG(i) PRINT_FMT(i,%ld)
#define PRINT_UINT(i) PRINT_FMT(i,%u)
#define PRINT_ULONG(i) PRINT_FMT(i,%lu)
#define PRINT_HEX(i) PRINT_FMT(i,%x)
#define PRINT_FLT(flt) PRINT_FMT(flt,%g)
#define PRINT_PTR(ptr) PRINT_FMT(ptr,%p)
#define PRINT_STR(str) PRINT_FMT(str,%s)
Я хочу определить другой список макросов, связанных с этим, но я бы хотел избежать ввода всего. Я уже написал один пример:
#ifndef UNITTEST
#define PRINT_INT_U(x) ((void)sizeof(x))
#else
#define PRINT_INT_U(x) PRINT_INT(x)
#endif
Вы видите, что я хочу, чтобы мои PRINT_
... _U
функции ничего не оценивали, когда я не запускаю модульные тесты, чтобы я мог спамить их и не беспокоиться о том, что они всплывают повсюду во время отладка или производство.
Итак, мой вопрос: есть ли какой-нибудь сумасшедший метод, использующий препроцессор для генерации новых операторов #define? Я думаю, что нет ...
edit : Могу я хотя бы сделать что-то подобное? составить список:
INT
LONG
UINT
ULONG
HEX
FLT
PTR
STR
и затем вставьте их все в шаблон
#define PRINT_%LI%_U(x) PRINT_%LI%(x)
, где %LI%
представляет элемент из списка.