yumetodo / 2015_C_Textbook

神楽坂一丁目通信局C言語講習会テキスト
3 stars 1 forks source link

int f(void);ではなくint f();を推奨 #66

Open yumetodo opened 8 years ago

yumetodo commented 8 years ago

C89では、それ以前のCと区別するため、引数のない関数は

int f(void)
{
    return 0;
}

のようにvoidを書く必要があった。

C99以降およびC++ではこれは互換性のためだけに残されている機能であり、また

C++17のドラフト文章である P0146R0: Regular Void では、将来的に廃止することを示唆している。

よって

int f()
{
    return 0;
}

のように書くことを推奨することを提案する

173210 commented 8 years ago

@yumetodo しかもそれが必要だったのはプロトタイプ宣言だけだった気がする。

yumetodo commented 8 years ago

@173210

/* C89 */
/* int f(); //NG*/
int f(void);/* OK */
/* OK */
int g()
{
    return 0;
}

こういうこと?

173210 commented 8 years ago

@yumetodo そういうことです。C言語のプロトタイプ宣言はvoid付き、他は全部なしでいいんじゃないですかね。

またinconsistencyが増えてしまう。今更変えてどうすんだ。

yumetodo commented 8 years ago

いやいや、今時C99すら使えないコンパイラなんてあるのか?

173210 commented 8 years ago

@yumetodo gnu11でも多分voidがないとどんな引数も許容します。 互換性についてはコンパイラが対応してるかしてないかだけでなく、いろいろと複雑な事情がありますからね。

yumetodo commented 8 years ago

http://melpon.org/wandbox/permlink/xjjpcFBf5gpCvjpI 実験してみたけど、挙動が理解できない・・・orz

173210 commented 8 years ago

@yumetodo mainの前にfgの実体があるからこうなるのでは?

yumetodo commented 8 years ago

http://melpon.org/wandbox/permlink/fp2OMhkdClmasiEa そうでもなさそう・・・

173210 commented 8 years ago

@yumetodo 別のファイルで宣言すればこうなりますね。 http://melpon.org/wandbox/permlink/JkOkoxNnwmCII3Hr

yumetodo commented 8 years ago

http://melpon.org/wandbox/permlink/mi2KhbWg6QC3zh8l さらに実験。ようは使うファイルから見える宣言がvoidついてなかったら引数渡せるのか。 というか宣言にvoidがなくて定義にvoidつけるとかした時エラーにならないのか・・・。

なおC++ではちゃんとチェックされる模様 http://melpon.org/wandbox/permlink/RW5lxX0GjPuBUMzu

173210 commented 8 years ago

@yumetodo コンパイラがC99でも、C99以前で書かれたコードは世には山ほどありますからね。

yumetodo commented 8 years ago

ということはあれか。

C

int f(void);
int f(void)
{
    return 0;
}

C++

int f();
int f()
{
    return 0;
}

こうか。

173210 commented 8 years ago

@yumetodo 実体の宣言にはvoidがいらないです。だからこうしましょう。

int f(void);
int f()
{
    return 0;
}

さて、ここでvoidつける、つけないの一貫性のなさが問題になりますが、C++がアレですし、こういった場合にはバイト数が少ない方でいいと思います。

yumetodo commented 8 years ago

そうですね・・・。