Независимо от возможных ловушек его использования, я нашел этот фрагмент кода в одном из заголовочных файлов ffmpeg:
/**
* Convenience macro, the return value should be used only directly in
* function arguments but never stand-alone.
*/
#define av_err2str(errnum) \
av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)
Мой вопрос о (char[AV_ERROR_MAX_STRING_SIZE]){0}
.
По сути, это создает char[]
массив в стеке и передает свой адрес стека как char*
быть заполненным на месте av_make_error_string()
,
Это синтаксис C99.
Имеет ли pre-C ++ 11 эквивалентный синтаксис?
Будет ли это также работать с C ++ 11?
Да, но в C ++ время жизни массива на самом деле что-то временно (только живое на время его выражения выражения, грубо говоря). В вашем примере C99 время жизни массива будет его окружением.
template<int I>
struct Array {
Array() {}
char data[I];
};
Тогда вы можете сказать
av_make_error_string(
(Array<AV_ERROR_MAX_STRING_SIZE>().data,
AV_ERROR_MAX_STRING_SIZE,
errnum)
Единственная цель пользовательского конструктора — предотвратить инициализацию нуля data
когда вы делаете Array<>()
, Если вы хотите инициализировать его, удалите конструктор. Конечно, boost :: array просто работает
av_make_error_string(
(boost::array<char, AV_ERROR_MAX_STRING_SIZE>().c_array(),
AV_ERROR_MAX_STRING_SIZE,
errnum)
Других решений пока нет …