2010-11-28 3 views
0

構造体のセットを含むグローバルインクルードファイルがあります。私のプログラムのどこかに、メンバ配列を含むクラスがあります。この配列の要素数は、特定の構造体の特定のフィールドのサイズに依存します。構造体のサイズが変更された場合、配列のサイズが自動的に更新されるようにしたいと思います。私は、次の式で正常にこれを行うことができた:配列のサイズはsizeof()に依存structフィールド

bool shadowChkBox[sizeof(FSCconfigType::WriteEn)*8*MAX_FSCS]; 

はFSCconfigTypeは構造体型であるとWriteEnは、分野の一つです。今これはubuntu上でのみ動作します。 RHEL 5では、コンパイラがエラーとして宣言しました。これを行うために他にどのような選択肢がありますか?私はQtと協力しています。

+2

あなたはRHに取得しているエラーは何ですか? –

+4

Linuxのバージョンではなく、使用しているGCCのバージョンに関係があると思われます。 – xscott

+0

フィールドを参照するのではなく、フィールドのタイプを直接使用できますか?私は(sizeofが変わるかもしれない理由のため)いいえを推測していますが、チェックするのは害ではありません。 – Steve314

答えて

2

は一つの可能​​な答えです:

#include <iostream> 

struct A 
{ 
     int a; 
     int b; 
     int c; 
}; 

bool items[sizeof(reinterpret_cast<A *>(0)->b)]; 

int main() 
{ 
     std::cout << sizeof(reinterpret_cast<A *>(0)->b) << ","; 
     std::cout << sizeof(items) << std::endl; 
     return 0; 
} 
+0

それは働いた。しかし、1つの質問。あなたは(0)で何をしていますか?ヌルアドレスと思われます。 –

+1

'sizeof'への引数は、型を決定する以外は評価されません。 'NULL'を' A * 'にキャストすることは、 'A'へのポインタの型を持つものを得る方法と同じくらい良いものです。 ( '(A *)printf(0)'も同様です)。 –

0

脆弱な答えは、WriteEnの値と次のフィールドの値の差を取ることです(または、構造体全体のサイズが不足している)。

これは、アラインメントベースのパディングのため、sizeofよりも少し大きい答えを与えるかもしれません。

大きな問題は、これを修正せずにフィールドを並べ替えるとどうなりますか。あなたが必死ならばオプションになるかもしれません。

ここ
+0

thxが、私はそれが必死ではない;) –

0
#include <iostream> 

struct C 
{ 
    int iv; 
    void* pv; 
    char buf[128]; 
}; 

template< typename TObj, typename TFieldType > 
std::size_t field_size(TFieldType (TObj::*)) 
{ 
    return sizeof(TFieldType); 
} 

int main() { 

    std::cout << field_size(&C::iv) << std::endl; 
    std::cout << field_size(&C::pv) << std::endl; 
    std::cout << field_size(&C::buf) << std::endl; 
} 
関連する問題