- ベストアンサー
戻り値を返す関数の前に(void)を付ける
今日会社で 変数 = (void)戻り値のある関数 #具体的な例としては下記一例を参照 と、ソースで書かれているものがあったのですが、 コメント等では、 「戻り値を明示しないときに(void)を付けて使用する」 と、書いてあります。 戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか?? または、このような動作にはならないのでしょうか。 自分自身、ソースの内容をうる覚えになっておりますので、 確認をしながらアップしていきたいと思いますので、 宜しくお願い致します。 /*一例*/ ・num1とnum2を足した値を返す int PlusPoint(int num1 , num2); ・PlusPointの値を格納する int Sum ◇ソース◆ #include <stdio.h> #include "Plus.h" int main(void) { int Sum; Sum = (void)PlusPoint; if(Sum == 2) { printf("false"); exit(0); } printf("true"); return 0; } *PlusPoint関数は外部で定義されている *プロトタイプ宣言はPlus.hに定義されいるものとする
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「戻り値を明示しないときに(void)を付けて使用する」 昨今では、あまり流行のスタイルではないと思いますが、 こういうコーディング規約の文化は、実際にありました。 lint(ソースのチェックツール)等で、(void)にキャストしていないと警告をあげるものもありました。 「冗長な記述」と見る向きも、「表明的な記述」と見る向きもあります。 > 戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか?? 動作的には、戻り値を(void)にキャストしてるのですね。 だから「明示的に『使わない』という表明」してるという意図です。 # 何も書いてないと、ミスで戻り値をチェックしてないのか、 # 分かった上でチェックの必要がないのか分かりにくい、と考えます。 Sum = (void)PlusPoint; とはいえ、こういう書き方はしない(できない)です。 コンパイル通らないでしょう? あくまで、例えばこんな感じで使います。 (void)PlusPoint(1, 2);
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
「関数の返り値を使わない (= 副作用のみを期待する)」ことを明示している (#1 の通り) ということで, しょぼいコンパイラだと void にキャストした方が最適化が強くかかる可能性はあります. が, さすがに (void)(a = b); なんてのは見たことないなぁ.
お礼
ご丁寧なアドバイスを頂ありがとうございます!! コーディングルールなので、、、なんともいえません。
- stiffels
- ベストアンサー率34% (25/72)
これは・・・ コーディング規約か何かなのでしょうか? はっきり言って会社でソース管理していくべき物なのであれば 可読性のない、もしくは理解し難いコーディングはやめるべきです。 私の部下にこういうコーディングする人間がいたら、絶対書き直させますねw
お礼
某N社のあるプロジェクトのコーディングルールです^^ 自分は、ここから抜けることになりましたが・・・・
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
補足というか、おまけに近いですが…… Cでは、「返値の型が明示されていない関数の返値は int 」なので、おおよその標準関数は int を返します。 例えば、printf() も putchar() も strcat() も 返値があります。 こういう関数は、実際に使う場合に返値をチェックしないことが多いですよね。 コンパイラは、「返値が定義されているけれど、普通は誰も返値を使わない」のか、「意味のある返値が定義されているけど、チェックし忘れ」なのか理解できません。 それで、コンパイラに対して、「わかっていてチェックしていない」と主張するのがこのパターンです。 (void)printf("hello world\n"); というもあり。(でも、これはさすがにうっとうしいという意見が強いでしょう)
お礼
「わかっていてチェックしない」 と言う意味なんですか?? 初耳です!!
お礼
返信が遅くなってすいません。 今のプロジェクトではこんなコーディングルールがあって、 自分でも知らないことだったので、驚きでした。 これ参考になりました。ありがとうございます。