У меня есть макрос, чтобы сделать версию аргументов по умолчанию:Как создать макрос, который определяет переменную?
#define Log_getMacro4(_1, _2, _3, _4, NAME, ...) NAME
#define Log_logWarning4(...) Log_log__("warning", __VA_ARGS__)
#define Log_logWarning3(...) Log_log__("warning", __VA_ARGS__, __LINE__)
#define Log_logWarning2(...) Log_log__("warning", __VA_ARGS__, __FILE__, __LINE__)
#define Log_logWarning1(...) Log_log__("warning", __VA_ARGS__, __PRETTY_FUNCTION__, __FILE__, __LINE__)
#define Log_logWarning(...) Log_getMacro4(__VA_ARGS__, Log_logWarning4, Log_logWarning3, Log_logWarning2, Log_logWarning1)(__VA_ARGS__)
Проблема заключается в том, что теперь я хочу, чтобы обеспечить вариант на той функции, которая освобождает первый аргумент Log_logWarning после:
#define Log_logWarning_free(str, ...) Log_logWarning(str, __VA_ARGS__); if (str) free(str);
Проблема в том, что это нельзя использовать с возвращаемым значением функции. Например:
char *foo(){
char *ret = (char*)malloc(30*sizeof(char));
strcpy(ret, "Hello World");
return ret;
}
void bar(){
Log_logWarning_free(foo());
}
Поэтому мне было интересно, если есть способ создать локальную переменную первой, в которой я присвоит первый аргумент макроса, а затем использовать эту переменную в тесте и последующее свободное.
Вы отметили как C++, так и C, какой? Из фрагмента кода, я полагаю, C. –
Я бы идеально хотел, чтобы макрос был достаточно общим для работы с обоими. (Это также объясняет, почему я выдал результат malloc() в char *). – chacham15
@StefanoSanfilippo Поскольку он спрашивает о макросах, ответ почти наверняка будет одинаковым для обоих языков. –