![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
#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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
実際に値が取得できるかどうかについては触れませんが、正しいマクロ定義の仕方は、
#define GET_INFO(data) \
do { \
/* 省略します。 */ \
} while(0)
というように、「while(0)」の前に「}」が必要です。
マクロ定義にダミー的なdo { } while(0)を使うテクニックは、約20年程前に某雑誌で「きだ あきら」という方が日本国内向けに公表してしまったテクニックです。
do { } while(0)を使うメリットは、if文中においてelseより前方で呼び出すときに実感できます。
No.2
- 回答日時:
流行ってるんですか?
別の人(?)の似たような質問が続いてるんですが。
#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] とかが確実だし。
No.1
- 回答日時:
エンディアンとか問題ない…んでしょうかね?
とりあえず、その書き方だと大量のコンパイルエラーが出そうですが。
# doの後の「{」に対応する「}」が遙か彼方へ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
エクセルVBA:日付データの変換...
-
printfの%eで指数部分の桁数を...
-
pythonでDBのカラム名で取得し...
-
matlabでのRRI検出
-
C#でのswitch文
-
matlabのソースコードをpython...
-
C言語
-
プログラミングについて
-
【Excel VBA】10進数を2進数に...
-
DataGridViewの特定列に入力さ...
-
Excel VBA メール作成について ...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
Rstudioによるテキストマイニン...
-
Excel 1セル当りの文字数が2...
-
SQLで1バイト、2バイト混在...
-
:(コロン)のKeyCode
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
エクセルVBA:日付データの変換...
-
10個の実数に対する降順ソート...
-
C#でのswitch文
-
int型(2バイト)データの分割
-
linuxのシェルでファイル名に先...
-
CreateProcessでの環境変数の設...
-
C言語 ファイル内のデータと入...
-
'dataType' 引数を Null にする...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
-
RegQueryValueExでの2バイト文字
-
C言語でのLinuxとwindows共通の...
-
ファイルから読み込むC言語の問題
-
c言語での wavファイルの編集(...
-
マクロ登録したピボットが重い...
-
python 気象データの取得
おすすめ情報