3

集約初期化子を使用して、単体テスト用の静的データのブロックを設定しています。

予想される要素数として配列サイズを使用したいのですが、提供される初期化子が少なすぎると失敗する可能性があります。

my_struct_type expected[14] =
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
};

これにより、Visual Studio 2008 でコンパイラ エラーは発生しません。

私はそれを次のように使用できるようにしたいと思います:

const unsigned expected_size = sizeof(expected) / sizeof(my_struct_type);

BOOST_CHECK_EQUAL(points.size(), expected_size);

for( int i = 0; i < expected_size; i++ )
{
    BOOST_CHECK_EQUAL(points[i].value, expected[i].value);
    BOOST_CHECK_EQUAL(points[i].count, expected[i].count);
    BOOST_CHECK_EQUAL(points[i].sym,   expected[i].sym);
}

しかし、14 ポイントのコンパイル時の保証がないため、これは、提供された値の配列の終わりから、デフォルトで初期化された値に入ります。

コンパイル時に集約配列初期化子の数を強制することはできますか?

4

5 に答える 5

5

実際には、配列の最後から実行されることはありません。これは、コンパイラが、自分で初期化しなかった配列のすべての要素をデフォルトで初期化するためです。

特定の数の初期化子が構成されていることを確認しようとしている場合、その方法がわかりません。

配列がアイテムの数であることを確認したいだけの場合:

my_struct_type expected[] =
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
};

トリックを行います。次にsizeof(expected) / sizeof(expected[0])、配列要素の総数を取得するために使用します。

于 2010-09-07T15:15:18.383 に答える
4

最初: これには警告があるかもしれません。最高の警告レベルでコンパイルしようとしましたか?

計算された値とリテラル値を交換すると、コンパイル時エラーが発生する可能性があります。

my_struct_type my_array[] = // <== note the empty []
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
};

BOOST_STATIC_ASSERT( sizeof(my_array)/sizeof(my_array[0]) == 14 );
于 2010-09-07T15:12:15.453 に答える
1

ISO / IEC 14882(初版1998-09-01)p。8.5.1.7は次のように述べています。

リスト内の初期化子が集約内のメンバーよりも少ない場合、明示的に初期化されていない各メンバーはデフォルトで初期化されます(8.5)。[例:struct S {int a; char * b; int c; }; S ss = {1、 "asdf"}; ss.aを1で初期化し、ss.bを「asdf」で初期化し、ss.cをint()形式の式の値(つまり0)で初期化します。]

簡単に言えば、あなたの質問に対する答えはノーです。

于 2010-09-07T17:00:17.870 に答える
1

ブースト以外の回答のために…</p>

を変更して、初期化要件を追加できますmy_struct_type

template< typename T >
struct must_be_initialized {
    T value;

    must_be_initialized( T const &v ) : value( v ) {}
     // no default constructor!

    operator T& () { return value; }
    operator T const& () const { return value; }
};

struct my_struct_type {
    must_be_initialized< double > f;
    int i;
    char c;
};

my_struct_type expected[14] =
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
     // error: no default constructor exists
};

my_struct_typeはまだ集約ですが、POD ではありません。

于 2010-09-07T16:30:12.403 に答える
0

msdnによると、指定された初期化子が少ない場合、残りの要素は 0 で初期化されるため、それでもコードは機能するはずです。

于 2010-09-07T15:04:57.897 に答える