- 締切済み
C,C++でシンボルの宣言を効率的に行う方法
C,C++でソフトを組んでいます。 質問はシンボルの割付け方法です。 例えば、 boolean_symbol ← BOOLEAN bynary_symbol ← BYNARY word_symbol ← WORD long_symbol ← LONG の様に上記4つのシンボルを宣言したいとします。 これを ↓質問 シンボル名 宣言要素数 ********* boolean_symbol, 1 → boolean_symbol ********* bynary_symbol, 2 → bynary_symbol[2] ********* word_symbol, 3 → word_symbol[3] ********* long_symbol, 4 → long_symbol[4] 上記の様に表記して、連続したメモリ上にシンボルを 割付けたいと思っています(分かりにくいでしょうか)。 このシンボル宣言だけで1ファイルとして分かり易く 宣言したいんですが、いい方法が見つかりません。 連続したメモリ上に任意の型、要素数を持たせるマクロ やその他の方法がありましたらご教授ください。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
あのう、余計なお世話かもしれませんが・・・ >具体的にいうと下記の様に宣言して >AAA(ULONG( long_symbol , 1), CONT) >AAA(UCHAR( bynary_symbol , 2), CONT) 使い方、これ見ても分からないんですが・・・ 特に、CONTって一体何? >&H00000 1 >&H00004 2 >&H00005 3 この表記は何ですか?VBですか? C,C++というのなら、それなりの書き方というものがあるんですが。 bynary→binaryですし。 うだうだ言っててもしょうがないんで。 こんな感じにマクロ定義したらできますかねぇ? #define DEC_START struct name{ #define DEC_END(name) } name; #define FACT(type, name, size) name type[size]; で、使用する関数の中で、 DEC_START FACT(ULONG, long_symbol, 1) FACT(UCHAR, bynary_symbol, 2) DEC_END(aaa) と宣言し、 aaa.long_symbol = 1; aaa.bynary_symbol[0] = 2; aaa.bynary_symbol[1] = 3; とすれば、近いことは出来ると思いますが。 なお、連続したメモリ領域を確保する場合にはアライメントに注意する必要がありますんで、1byte確保した次にlongを確保すると穴があきます。これを避けるには、コンパイルオプションを変えれば可能ですが、実行速度が遅くなるのでお勧めしません。 あと、C、C++ではビット単位で領域は確保できません。 本当は何がされたいのでしょうか?
- osamuy
- ベストアンサー率42% (1231/2878)
typedef struct { bool flag; uint8_t bin[2]; uint16_t word[3]; uint32_t lng[4]; } Sym_t; のように構造体を型定義するとか。 採取的な「何がしたい」(例えば「固定長データファイルを読み込みたい」とか。)ってのを、きちん説明しとくと、回答がつきやすいと思います。
補足
具体的にいうと下記の様に宣言して AAA(ULONG( long_symbol , 1), CONT) AAA(UCHAR( bynary_symbol , 2), CONT) ソース内で下記の様にシンボルをそのまま使え long_symbol = 1; bynary_symbol[0] = 2; bynary_symbol[1] = 3; メモリ上は &H00000 1 &H00004 2 &H00005 3 となるようにしたいんです