「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つで、「条件コンパイル」という機能にあたるもの
  • 主に、重複定義回避のためにヘッダファイルで使用される

条件コンパイル とは

  • プログラムの中で不要な部分をカットする

  • カットしたい部分をコメントアウトすることでも対応できるが、

    不要な部分が何十行にも渡る場合は、条件コンパイルを使ったほうが便利

なぜ重複定義を回避しなければならないか

  • 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定義がされていなければコンパイルする」という意味になる

プリプロセス~コンパイル時の動き

  1. プログラムで初めてHoge.hがインクルードされる
  2. まだINCLUDE_Hoge_h_が定義されていないので、#ifndefは無視され、処理部分がコンパイルされる

  また、#defineによりINCLUDE_Hoge_h_が定義される

  1. 2回目以降にHoge.hがインクルードされると、すでに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

▼条件コンパイルによる重複定義の回避

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にもデフォルト値が必要

初投稿


初投稿ということで、テスト投稿を兼ねて当ブログの内容について。

ブログ開設の目的

プログラミングの勉強のアプトプット先として開設しました。

アウトプット先を作ることで、怠け者であり理解力が乏しい私が勉強を続け、

技術力を身に着けることが出来れば良いなと思ったのがきっかけです。

投稿内容

プログラミング言語C++

内容のレベルとしては、自分のメモ程度。

勉強のことだけでなく、日常での気付きや考えとかも投稿していければと思っています。

こんな感じで、ゆるゆるとやっていきます。