![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
#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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
パワースペクトルについて教え...
-
int型(2バイト)データの分割
-
c言語での wavファイルの編集(...
-
C言語の構造体にてバブルソート...
-
RegQueryValueExでの2バイト文字
-
C言語
-
C#でのswitch文
-
テキストファイルの結合について
-
結城未来さんの年齢
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
linuxのシェルでファイル名に先...
-
構造体のソートの方法について...
-
連想配列をリターン値として返...
-
PerlでWebから送信(submit)の...
-
Perlで指定した期間で合致する...
-
KSHでの文字列操作
-
VisualBasicでレジストリキーの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
pythonでDBのカラム名で取得し...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
linuxのシェルでファイル名に先...
-
C言語の構造体にてバブルソート...
-
c言語での wavファイルの編集(...
-
'dataType' 引数を Null にする...
-
H8/36064を使ったシリアル通信...
-
オセロゲーム 2次元配列で困...
-
10個の実数に対する降順ソート...
-
c言語の多次元配列で1から100ま...
-
c言語 配列から数字だけをint型...
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
おすすめ情報