- 締切済み
関数マクロの書き方
#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の書き方は 間違っていますでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tort_Capa
- ベストアンサー率21% (19/88)
実際に値が取得できるかどうかについては触れませんが、正しいマクロ定義の仕方は、 #define GET_INFO(data) \ do { \ /* 省略します。 */ \ } while(0) というように、「while(0)」の前に「}」が必要です。 マクロ定義にダミー的なdo { } while(0)を使うテクニックは、約20年程前に某雑誌で「きだ あきら」という方が日本国内向けに公表してしまったテクニックです。 do { } while(0)を使うメリットは、if文中においてelseより前方で呼び出すときに実感できます。
- D-Matsu
- ベストアンサー率45% (1080/2394)
そもそもint型同士の代入(でなけりゃdataがバッファオーバーフローでコケる)でmemcpy使う神経が理解できませぬ。
- kmee
- ベストアンサー率55% (1857/3366)
流行ってるんですか? 別の人(?)の似たような質問が続いてるんですが。 #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] とかが確実だし。
- Wr5
- ベストアンサー率53% (2173/4061)
エンディアンとか問題ない…んでしょうかね? とりあえず、その書き方だと大量のコンパイルエラーが出そうですが。 # doの後の「{」に対応する「}」が遙か彼方へ。