ちょっとC言語を触っていて気になったのでメモしておきます。
僕のプロフィールはこちら
気になったのはこちら
1 2 3 4 5 |
void *hoge(void) { // 何かしらの処理 } |
↑はただのサンプルプログラムなんですが、引数に「void」ってありますよね。
他の言語を基準に考えると違和感ありありだし、「そもそも意味ないんじゃね?」って思って書いていなかった時期もあります。
が、これには意味がある、というかプログラムを実行すると挙動が違うんですよね。。
引数にvoidがない場合
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> void hoge() { printf("あほー"); } int main(void) { // 引数が2つ hoge(1, 2); return 0; } |
hoge関数には引数がありませんが、main関数で呼び出す際に引数を2つ指定しています。
普通に考えると実行時にエラーが出そうです。
1 2 3 4 |
Running /home/ec2-user/environment/arg_void.c あほー Process exited with code: 0 |
ところがどっこい!
標準出力も正常に行われていますし、コード0も返却されています。
引数にvoidがある場合
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> void hoge(void) { printf("あほー"); } int main(void) { // 引数が2つ hoge(1, 2); return 0; } |
hoge関数に「void」を指定しました。
この状態で実行してみます。
1 2 3 4 5 6 7 8 9 10 11 |
Running /home/ec2-user/environment/arg_void.c /home/ec2-user/environment/arg_void.c: In function ‘main’: /home/ec2-user/environment/arg_void.c:10:5: error: too many arguments to function ‘hoge’ hoge(1, 2); ^ /home/ec2-user/environment/arg_void.c:3:6: note: declared here void hoge(void) { ^ Process exited with code: 1 |
あら不思議。
「引数多すぎ!!」って言われてエラーになりました。
何が起きている??
まあ、C言語はそういうもんってことです。
要約すると、voidを記載しなかった場合、呼び出し先関数は呼び出し元で指定された引数の数までチェックしないってことです。
引数が何個渡されようが関係ないぜってスタンスですね。
voidを指定したら?
見てきた通りですが、voidを記載すれば、「呼び出し元からは何も渡されていないよね?」っていうチェックが行われるわけです。
で、どっちがいい?
普通に考えて、本来呼び出し先関数は引数がないので呼び出し元も空であるべきです。
voidを記載しない場合、プログラム自体は動いてしまうので余計な誤解を生んでしまいますし、何より気持ち悪い。
なので、関数において引数がない場合は「void」を記載するべきです。
参考サイト
■【C言語】引数なしの関数には void を書いた方がよいという話
URL:「http://0x19f.hatenablog.com/entry/2019/04/17/213231」
まとめ
どうでもいいんですけど、「#include <stdio.h>」の「stdio.h」って「スタンダードアイオーヘッダ」って読むじゃないですか?
カッコイイですよね。
以上です。
さよなら。