「return 0」と「return 1」
関数の終了とともに値を返すことのできるreturn文
if文やwhile文の条件式では非ゼロが真で、ゼロが偽なのに
なぜreturn文では1が異常終了で、0が正常終了なのか?と思ったのでメモ
こちらの質問に回答がありますね
▼C言語のtrueとfalseについて
https://teratail.com/questions/48765
一部だけ抜粋
例えばWindows APIの戻り値の0は概ね成功を示します。一般に成功は1つですが、失敗は様々な原因があるのでエラー・コードを複数割り当てたいという要求から来る仕様と思います。(もちろん例外はあります。)
同様にmain()関数の戻り値はOSへ返却されます。成功は1つでエラーを複数返却できるようにしたいということです。
なるほど~
#ifndef ~ #endif とは
ヘッダファイルに#ifndefと#endifというものが登場してきたので、何者なのか整理しておく
#ifndef ~ #endif とは
条件コンパイル とは
なぜ重複定義を回避しなければならないか
- 1つのプログラムで、2回以上同じ宣言をしてはいけないため
ヘッダファイルでの条件コンパイル(#ifndef ~ #endif)
ヘッダファイルで条件コンパイルを使う理由
1つのプログラムで、あるcppファイルがHoge.hをインクルードし、
別のcppファイルが同じヘッダファイルをインクルードすると、同じ宣言を2回していることになってしまう
そこで、条件コンパイルを使用し、重複定義を回避する
使い方、意味
記号定数の定義とソースコードを挟む
#ifndef INCLUDE_Hoge_h_ #define INCLUDE_Hoge_h_ //処理 #endif
記号定数「INCLUDE_Hoge_h_」の名前は任意だが、ヘッダファイル名と同じにしておくとわかりやすい
「ifndef」とは、if(もし)、not(されていない)、def(define定義)というもので、
「もし、define定義がされていなければコンパイルする」という意味になる
プリプロセス~コンパイル時の動き
また、#defineによりINCLUDE_Hoge_h_が定義される
#ifndefにより、#defineと処理部分はコンパイルされない
その他の条件コンパイル
ifndefと逆の動きをするifdefもある
詳しくは以下でわかりやすく説明されている
https://monozukuri-c.com/langc-ifdef/#toc10
参考
▼【C/C++】ヘッダーファイルの#ifndef ~ #endifの意味
https://www.kinjo-u.ac.jp/ushida/tekkotsu/cpp/ifndef.html
▼条件コンパイルによる重複定義の回避
デフォルト引数の使用
使用書籍:「独習C++ 第3版」
デフォルト引数とは
関数の呼び出し時に指定されていない引数があるときに、対応する仮引数にデフォルト値を与えることができる機能
使用例
- 2つの仮引数のデフォルトとして0を定義する場合
void f(int a = 0,int b = 0);
- 以下の3通りの方法で呼び出すことができる
f(); //aとbにデフォルト値の0を使用する f(10); //aは10、bはデフォルト値の0 f(10,99); //aは10、bは99
制約
上記「使用例」からもわかる通り、aにデフォルト値を使用し、bの値を指定することは出来ない
デフォルト引数を持つ関数を作成する場合、デフォルト値はプロトタイプか定義のどちらかで指定する
プロトタイプと定義の両方でデフォルト値を指定することは出来ない
デフォルト仮引数は、デフォルト値を持たないすべての仮引数よりも右側に記述する必要がある
たとえば、以下のようにするとコンパイルエラーが発生する
void f(int a=0,int b); //bにもデフォルト値が必要