2

使用の潜在的な落とし穴に関係なく、ffmpeg ヘッダー ファイルの 1 つでこのコード スニペットを見つけました。

/**
 * 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 構文です。

C++11より前の構文には同等の構文がありますか?
これは C++11 でも動作しますか?

4

1 に答える 1

3

はい。ただし、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)

ユーザー定義コンストラクターの唯一の目的はdataArray<>(). 初期化する場合は、コンストラクターを削除します。もちろん、boost::array も同様に機能します

av_make_error_string(
    (boost::array<char, AV_ERROR_MAX_STRING_SIZE>().c_array(), 
     AV_ERROR_MAX_STRING_SIZE, 
     errnum)
于 2013-06-26T20:58:19.057 に答える