![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
C言語のvoid型ポインタ変数について。
C言語のvoid型ポインタ変数について質問があります。
組み込み系の開発を行っているのですが、現在使用しているシステムで、
提供されている "API" を介してアプリケーション部のソフト作成を行っています。
この "API" ですが、引数の多くはvoid型ポインタとなっています。
ある人がこの引数がvoid型となっているのを見て、
『なんでvoid型なんや??、C言語でアセンブラと違うんやから、void型なんかにしない方が良い』
とおっしゃいました。
この意味がよくわからなかったのですが、なぜ void型はよろしくないんでしょうか?
--
僕が思うに、APIなんやから引数を void型ポインタ にすることでどんな型にも対応できる
汎用的であると感じ、逆にこの方が良いのではと感じたのですが。。
-API例----
int _exApiKannsuu( char in_data, void* out_data )
"in_data" をもとに "out_data" を取得する。
どーやらこの "out_data" が void型 であるのががよくないらしい・・
No.1ベストアンサー
- 回答日時:
同じ関数で 複数の型のデータを扱うのでなければ特定の型のポインタにしたほうが良いでしょう
このAPI宣言だけみた使用者は 何型のポインタを渡せば良いのかわかりません
char*で良いのか int*が必要なのかはたまた何かの構造体のポインタを要求しているのか ・・・
No.5
- 回答日時:
>int _exApiKannsuu( char in_data, void* out_data )
他の方も指摘されていますが、この関数がin_dataを元に
何を行ってout_dataに何を返すのかがわかりません。
それにout_dataに何を指定すればいいのか、どのくらいのサイズが
必要なのかもわかりません。どんな型にも対応できるということは、
どんな型を渡せばよいか分からないということでもあります。
逆にこの関数を作った人も、out_dataがどこまで書き込めるのか、
などが判りづらくなり、特定の決まったもの処理して返すならば、
out_dataのサイズを渡すかそのサイズ分の領域がわかるような引数を
取るべきだと思います。
どんなものにも例外はあると思いますが、今回であれば
該当の関数が与えられる引数の型に依存しない処理を行うのであれば
void*型でも良いと思います。(その場合はその領域のサイズを指定させるなどが良く行われると思いますが)
No.4
- 回答日時:
> 僕が思うに、APIなんやから引数を void型ポインタ にすることでどんな型にも対応できる
> 汎用的であると感じ、逆にこの方が良いのではと感じたのですが。。
その論法からすれば、関数原型を止めてしまうか、第2引数以降を可変個引数にした方が汎用性が高まるはずです。
しかし、実際にはそんなことはありません。
void*をint*や構造体型*のようにしても、(C++ではないので)コンパイル時にエラーを検出できるわけではありませんが、警告ぐらいは出ることを期待できます。
ただし、(memcpyのように)具体的な型情報が必要ない場合には、void*の方がよいでしょう。
それに_exApiKannsuuという関数名がよくありません。この名前を見ても、何をする関数なのかさっぱり分かりません。当然、各引数に何を渡せばよいのかも想像がつきません。また、下線から始まる外部識別子は予約済み識別子であり、こんな関数名では動作が未定義になります。さらに、Kannsuuというのは「関数」の意味のローマ字表記だと思いますがスペルが間違っています。
こうした状況を考えると設計も実装も非常に怪しく、すべてに対して疑ってかかりたくなる気持ちも十分理解できます。
No.3
- 回答日時:
「void型ポインタ にすることでどんな型にも対応できる」ので、
うっかり間違ってもコンパイル時にエラーとなってくれません。
/* 文字列の長さを返す関数があったとしよう */
int stringLength(void* str); /* strは文字列であるべし! */
int n;
int length = stringLength(&n); /* エラーにしてくれない */
No.2
- 回答日時:
あなたの意見の通りだと思います。
本来はある人の意見のように、全ての型の引数を用意し、同じ関数名で関数定義すべきなのかもしれません。しかし、その組合せが組合せの爆発を起こすと、そうも言っていられないでしょう。なので、あるシリーズの関数群の引数は、違う型の可能性のあるものはvoidポインタで統一する、というのはありだと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# 関数名 (type *) 1 2022/03/28 10:55
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
C言語の関数と配列に関する質問
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
参照型で受け取った引数をポイ...
-
構造体とfscanf
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
main(int argc,char **argv[])...
-
DLL<->VB間での受け渡し(文字...
-
エラーの意味
-
PASCALとFARの意味
-
ハンドルはポインタか
-
CWnd::EnableWindow()の扱い方
おすすめ情報