Open yumetodo opened 8 years ago
@yumetodo しかもそれが必要だったのはプロトタイプ宣言だけだった気がする。
@173210
/* C89 */
/* int f(); //NG*/
int f(void);/* OK */
/* OK */
int g()
{
return 0;
}
こういうこと?
@yumetodo そういうことです。C言語のプロトタイプ宣言はvoid
付き、他は全部なしでいいんじゃないですかね。
いやいや、今時C99すら使えないコンパイラなんてあるのか?
@yumetodo gnu11
でも多分void
がないとどんな引数も許容します。
互換性についてはコンパイラが対応してるかしてないかだけでなく、いろいろと複雑な事情がありますからね。
http://melpon.org/wandbox/permlink/xjjpcFBf5gpCvjpI 実験してみたけど、挙動が理解できない・・・orz
@yumetodo main
の前にf
やg
の実体があるからこうなるのでは?
@yumetodo 別のファイルで宣言すればこうなりますね。 http://melpon.org/wandbox/permlink/JkOkoxNnwmCII3Hr
http://melpon.org/wandbox/permlink/mi2KhbWg6QC3zh8l さらに実験。ようは使うファイルから見える宣言がvoidついてなかったら引数渡せるのか。 というか宣言にvoidがなくて定義にvoidつけるとかした時エラーにならないのか・・・。
なおC++ではちゃんとチェックされる模様 http://melpon.org/wandbox/permlink/RW5lxX0GjPuBUMzu
@yumetodo コンパイラがC99でも、C99以前で書かれたコードは世には山ほどありますからね。
ということはあれか。
int f(void);
int f(void)
{
return 0;
}
int f();
int f()
{
return 0;
}
こうか。
@yumetodo 実体の宣言にはvoid
がいらないです。だからこうしましょう。
int f(void);
int f()
{
return 0;
}
さて、ここでvoid
つける、つけないの一貫性のなさが問題になりますが、C++がアレですし、こういった場合にはバイト数が少ない方でいいと思います。
そうですね・・・。
C89では、それ以前のCと区別するため、引数のない関数は
のように
void
を書く必要があった。C99以降およびC++ではこれは互換性のためだけに残されている機能であり、また
C++17のドラフト文章である P0146R0: Regular Void では、将来的に廃止することを示唆している。
よって
のように書くことを推奨することを提案する