C ++ версия временной переменной локального массива C99

Независимо от возможных ловушек его использования, я нашел этот фрагмент кода в одном из заголовочных файлов 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?

2

Решение

Да, но в 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)
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector