c++始めてみた：Mac-Air(2013)にXcodeで環境構築をしてみた個人ノート1.5

# MacbookAir(2013)でc++の環境構築をしてみた

そういえば、古い Macbook Air (2013) 13 inch を普段使い用に使っていて
ここにいる皆さんとは比べ物にならない低いマシンパワーじゃないかなとふと思いました。
ノートゲーミングPC（Ubuntu）もあるにはあるんですが、起動している時間が２−４時間とか普段使いには使い難いんですよね。基本大量の計算とかGPUがいる処理用にしか使ってません。（移動民族なのでノートしか選択肢がありません）
そろそろ替え時だとは思ってはいるんですが、最新型のタッチバーとかよく分からんです。サーフェイスも性能の割には高いし、DELLにしようか、凄く悩みます。薄い軽いノートを買ってUbuntu２台持ち？は何となく不安（2019年8月現在）

## 環境
Macbook Air 13 Mid 2013
macOS Mojave Version 10.14.6
Xcode 10.3をダウンロード

## 参考資料

[Youtube video: "How to Setup C++ on Mac"](https://www.youtube.com/watch?v=1E_kBSka_ec)

上のYoutube Videoに沿って、xcodeをダウンロードして設定とかを決めて
実際にコードを実行してみたところ、

```hello.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << "Hello World" << endl;
}
```

` 'bits/stdc++.h' file not found `

いきなりエラーが出ました。

そこでググると「[stackoverflow](https://stackoverflow.com/questions/28994148/how-can-i-include-bits-stdc-in-xcode) 」で問題点を解説していて、「[stdc++.h](https://gist.github.com/reza-ryte-club/97c39f35dab0c45a5d924dd9e50c445f)」が必要との事なのでそのファイルをダウンロードして自分の好きなフォルダに保存
そしてまた実行してみる

```hello2.cpp
#include "/<自分の好きなフォルダ場所>/stdc++.h"
using namespace std;

int main() {
    cout << "Hello World" << endl;
}
```

するとビルド？が成功し、Hello World も無事アウトプットする事が出来ました。
ですがc++14を使いたいのに、右側のサイドバーにはDefault - C++ Sourceという基準になっていて
上の二つの基準がどう違うのか良く分かりません。

## 追記

ググっていると

[C++ Newbie Tour: Getting Started With C++ On Mac OSX](https://kig.re/2018/09/20/c++-newbie-tour-how-to-get-started-with-c++-on-mac-osx.html)

という記事を見つけて
c++のバージョンを調べてくれるコードを見つけたので実行してみると

```version.cpp
#include <iostream>
int main(){
  #if __cplusplus == 201402L
    std::cout << "C++14" << std::endl;
  #elif __cplusplus==201103L
    std::cout << "C++11" << std::endl;
  #else
    std::cout << "C++" << std::endl;
  #endif
  return 0;
}
```

c++14と出たのでc++14なんですかね？

Xcode内を調べてみると

`Build Settings` の `Apple Clang - Language - C++` の `C++ Language Dialect`
が `GNU++14 [-std=gnu++14]` を採用していたらしく、これのお陰でc++14基準になっているんだろうか？と予測を立ててみました。

他にも沢山候補があったので

`GNU++14 [-std=gnu++14]`の部分を

`c++11 [-std=c++11]`や`GNU++11 [-std=gnu++11]`に変えると

上のコードの結果がc++11になったので
多分そうなんだろうと思いました。合ってますかね？

`GNU++17 [-std=gnu++17]`と`c++17 [-std=c++17]`の候補もあったので
これもテストしてみます

[What is the value of __cplusplus for C++17?](https://stackoverflow.com/questions/38456127/what-is-the-value-of-cplusplus-for-c17)

上の記事によると、c++17のcplusplusの値は `201703L` らしいので

```version2.cpp
#include <iostream>
int main(){
  #if __cplusplus == 201703L
    std::cout << "C++17" << std::endl;
  #elif __cplusplus == 201402L
    std::cout << "C++14" << std::endl;
  #elif __cplusplus==201103L
    std::cout << "C++11" << std::endl;
  #else
    std::cout << "C++" << std::endl;
  #endif
  return 0;
}
```

というコードを新たに試してみました。

予想通りに、候補を変える度に
結果がc++11, c++14, c++17と変わっていきました。

あと、AtCoderでは
`Program ended with exit code: 0`
という値が出てこないのですが、ここでは（Xcode上では）毎回最後に出てきます。
何でだろうと思い、ググってみると

`The message doesn't come from your program itself, but from the IDE (e.g. Visual Studio) that launches the program. Try launching it from the command-line or by double-clicking the .exe file.`

あれ？IDEを使っていると出てくるらしいんですが、command-line-toolをXcode内で選んでいたと思ったんですけど、よく分かりません。

ただ、エラーが無いという事を教えてくれているだけなので、別に大した事では無いですね。

あと、`GNU++`と`c++`の違いは？？？

[What are the differences between -std=c++11 and -std=gnu++11?
](https://stackoverflow.com/questions/10613126/what-are-the-differences-between-std-c11-and-std-gnu11)

上の記事によると

`The difference between the two options is whether GNU extensions that violates/extend the C++ standard are enabled or not.`

二つの違いは
標準c++を拡張する/違反するGNU拡張が使えるかどうか・・・
意味がよく分かりませんがGNU用かそうでないかという事なんですかね？
なので基本c++14を使う予定です。

## これで初心者用のコンパイラの構築は出来たかな？と思います

まだ気になっている事
- gcc?
- g++?
- IDE?
- CMake?
- Clang?
- Clion?
- などなど

https://solarianprogrammer.com/2017/05/21/compiling-gcc-macos/
https://kig.re/2018/09/20/c++-newbie-tour-how-to-get-started-with-c++-on-mac-osx.html

追記
下のコードでもstdc++.hが使えるようになりました。
＜＞とか””とかの機能はどう違うんですかね？

```hello3.cpp
#include </"自分の好きなフォルダ場所"/stdc++.h>
using namespace std;

int main() {
    cout << "Hello World" << endl;
}
```