dポイントプレゼントキャンペーン実施中!

#difine GET_INFO(data) \
do{\
char* addr = topaddr + sizeof(int);\
memcpy(&data,addr,sizeof(int)); \
while(0)


取得さきのメモリのデータ構造は
typedef struct _data_t{
int data[2]
}data_t

data_t test;

メモリ上のデータの先頭アドレスはtopaddrとなっている状態で

test.data[1] の値を取得する関数マクロの定義としてGET_INFOの書き方は
間違っていますでしょうか?

A 回答 (4件)

 実際に値が取得できるかどうかについては触れませんが、正しいマクロ定義の仕方は、




#define GET_INFO(data) \
do { \
/* 省略します。 */ \
} while(0)


というように、「while(0)」の前に「}」が必要です。
 マクロ定義にダミー的なdo { } while(0)を使うテクニックは、約20年程前に某雑誌で「きだ あきら」という方が日本国内向けに公表してしまったテクニックです。
 do { } while(0)を使うメリットは、if文中においてelseより前方で呼び出すときに実感できます。
    • good
    • 0

そもそもint型同士の代入(でなけりゃdataがバッファオーバーフローでコケる)でmemcpy使う神経が理解できませぬ。

    • good
    • 0

流行ってるんですか?


別の人(?)の似たような質問が続いてるんですが。


#difine → #define にして
使うときは
GET_INFO(d) ; } while(0) ;
という風にすれば、おそらく期待通りの動作をするでしょう。
見掛け上は、}が対応とれませんが、それはそれでソースの難読化に使えます。



これ、マクロで書く意義ってあるのでしょうか?
memcpy呼びだしてるから効率化/高速化になってないし。
sizeof(d) == sizeof(int)の変数dに対してでないと、転送される領域が足りなかったり余ったりして、バグの元だし。
test.data[1]の値を取りたいなら d = test.data[1] ; でいいだろうし。
topaddr + sizeof(int)なんて環境や実装に依存する方法よりは、 ((data_t *)topaddr)->data[1] とかが確実だし。
    • good
    • 0

エンディアンとか問題ない…んでしょうかね?



とりあえず、その書き方だと大量のコンパイルエラーが出そうですが。
# doの後の「{」に対応する「}」が遙か彼方へ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!