Ответ 1
Самый простой способ сделать ваш конкретный пример - с переменным макросом:
#define DEBUG_TRACE(...) \
do { \
std::string p[] = { __VA_ARGS__ }; \
log _log(__FUNCTION__, p, (sizeof p) / (sizeof p[0])); \
} while (0)
Несколько примечаний:
-
__VA_ARGS__
- это имя для списка разделенных запятыми аргументов, предоставленных макросу - Вы можете узнать, сколько их в вашем случае использует
sizeof
, так как p - статический массив - Окружать ваш макрокоманд в do..это часто считается хорошей практикой, потому что он дает переменные (p) область блока, так что пользователи могут по-прежнему иметь переменную с тем же именем вне макроса, а часть while (0) красиво принимает точку с запятой после этого, не нарушая одну строку, если утверждения
Если вам требуется больше гибкости, чем это, вы можете использовать очень аккуратный трюк, чтобы вы могли явно "перегрузить" макрос, чтобы вести себя совершенно по-другому с различным количеством параметров. Однако это делает код более запутанным и его следует использовать только в том случае, если это абсолютно необходимо. Поскольку кажется, что вариационные аргументы будут хорошо подходят для вашего случая использования, я просто предоставил ссылку: http://cplusplus.co.il/2010/07/17/variadic-macro-to-count-number-of-arguments/