Edited at

C++ N4606 のコード断片をコンパイルするためにしていること

More than 1 year has passed since last update.

N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていることを記録します。

N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list

https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/


0 ファイル名

一つの節ごとに1ファイルを目標に、

p00.cppというページ番号のファイル名を採用します。

clang++がエラーを20で上限にしています。エラーが多い場合には、次の考え方に基づいてファイルを分割します。


0.0 ファイルを2つ以上に分割

したり、同じページに2つの節がある場合には、p00-2.cpp, p00-3.cppというファイルを順に作ります。

分割は大体の感じで気まぐれです。


0.1 コンパイルエラーなどで大幅に手を入れ

たり、参考にするために改良したファイルは、p00a.cppという具合に、a,b,cを追記します。


1 環境

hosted環境であれば、main関数がなければmain関数をつける。

freestanding環境であれば、当該freestanding環境のstartup関数を記述する。


1.1 int main()関数の場合には

main関数の最後に

  return EXIT_SUCCESS;


2タブ

2つの空白文字を入れている。3文字以上の空白は画面の右の方へずれる。

C beautifierのような清書の道具を用いるとよい。

tabは2つの空白文字に設定できるものがよい。

現在、利用していない。良さげなものを物色中。20180412現在


style

20180414追記

$ brew install astyle

$ astyle -s2 -c < p231.cpp > p231bs2.cpp

で整形。p231.cppから利用。

すぐにパラメータを忘れるのでシェルスクリプトa.shに。p253.cppから。20180420追記。

整形したソースをwebに貼り付けるためにcatで出力。


a.sh

#!/bin/bash

astyle -s2 -c < $1.cpp > $1s2.cpp
cat $1s2.cpp

$ chmod +x a.sh

$ ./a.sh p253

namespaceのカッコの中のタブ(空白)を生成しない。オプション未調査。


3 文字コード

2バイト空白はコンパイルエラになる。

'’'c'’'

PDFからコピペした'’'はsingle quote '''ではない。コンパイルエラーになる。文字の置換を行う。


4 include

ヘッダファイルが必要であれば、includeする。


4.1 std::coutを書く場合は

#include <iostream>

using namespace std;

cout << endl;

という感じでnamespaceを宣言してstd::は省略できるようにしている。

見通しやすさから。


4.2 コンパイルエラー、警告で

includeファイルを推奨してもらえる場合は、素直にincludeする


4.3 コンパイルエラー、警告でincludeファイルの推奨がなければ、

あまり見たことがない文字列+「c++」「include」の3単語で検索する。

C++の説明のページで、ヘッダファイルの説明があれば、ひとまずincludeする。


4.4 complex

complexは_Complex double を宣言すればコンパイルエラーがなくなるのであれば宣言する。

それ以外の場合の対処法は要検討。


5コンパイルエラー、警告

は保存する.


5.1 shellスクリプトで自動的にコンパイル、実行する。

コンパイル、実行のスクリプトは

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)

https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da


3.1 あらかじめ

コンパイルエラーが出ることを想定している行は、コードの中にコンパイルエラーをいれてコメントすることがある。

上記スクリプトでは、プログラムを複数個入力に用いる場合には違うコマンドを用いる。引数で一つ、実行プログラムにデータを渡せるようになっている。main関数の場合は、int main(int argc, char* argv)で

定義する。


6 std:coutで出力きる変数を探す。

何もないときは、msgにその節の標題を文字列としていれて、

  cout<< msg << endl;


6.1 実行結果も記録する。

実行結果の編集出力用のマクロを作成しました。変数名を入れれば、変数名と値を出力するものです。C puzzle bookからの参照で、C++用に書き直したものです。

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識

https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

初出はこちら

N4606(121)10 Derived classes [class.derived]p256

https://qiita.com/kaizen_nagoya/items/b466190ade79377dc0fc

#define PR(a)    cout<< #a"="<<a << endl;

...
int i= 2;
PR(i);
...

i=1

可変長引数のマクロ定義はtemplateに移行中。

可変長templateを学ぶ

https://qiita.com/kaizen_nagoya/items/8e7abc71f8c6516fc9f4

文字処理の部分をどうC++で書くとよいか思案中。


7 関数の中での記述でないとコンパイルできない行は、

main(startup)関数の中に入れるか、新たな関数を書き、main(startup)関数から呼出す。


8 変数、定数で値が入っていないとコンパイルできなければ、

値を入れる。


8.1 複数の変数がある場合は、異なる値を入れる。


8.2 ファイル入力の場合は、該当するソースコードファイルそのものを指定する(エラーにならなければ)


9 同じ変数、同じ関数を別の目的で使っている場合は、

ファイルを2つ以上に分割する。


9.1 変数名・関数名に番号をつける

だけで見た目にわかりやすい場合には、ファイルを分割せずに、変数名・関数名に番号をつける


10 省略記号

”...”などで、何か実際に式がないと

コンパイルエラーになる場合には、コンパイルエラーにならない差し障りのない式を書く。


11 リンクエラー

が出る場合には、リンクエラーにならない差し障りのない関数の記述などをする


12 実行時エラー

になる場合で、定数、変数の値、ファイルの内容を変えれば、実行時エラーにならないかどうか工夫してみる。


13 clang++, g++

の警告、コンパイルエラー、リンクエラー、実行時エラー、実行結果で顕著に違うものは、

記録する。

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較

https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f


14 C++2003, C++2011 C++2017でのコンパイル

C++2003とC++2017の違いを記録する。

C++2003とC++2017でコンパイルエラーになるならない事例集

https://qiita.com/kaizen_nagoya/items/a13ea3823441c430edff


15まとめ方

#はじめに(Introduction)

##作業方針(sequence)
## C++N4606符号断片算譜一覧(example code compile list)
#本文(題名を記述)
##算譜(source code)
##編纂・実行結果(compile and go)
#検討事項(agenda)
#参考資料(reference)
#文書履歴(document history)

はじめにに、背景(background)、道具類(told)、作業方針(sequence)、符号断片編纂一覧(example code compile list)を示す。

作業方針で、編纂誤(compile error)の収集などの目的を記述する。

本文は、算譜と編纂・実行結果からなる。

算譜は、規格文書の符号断片を編纂(compile)できる形にしたものである。

編纂・実行結果は、編纂誤、連携誤(link error)、実行時誤を含み、実行結果を示す。実行結果は、意味のある内容にするように算譜に手を入れるようにしている。意味のある実行結果を出力するようにしようとすると、新たな編纂誤、連携誤を生むことがある。

C/C++の仕組みとOS等との境界と協調の理解が必要だと感じることがある。

課題は、編纂誤、連携誤、実行時誤および意味のある出力の他、clang++, g++, 標準の2003, 2011, 2017への対応状況などを含む。

参考資料は、主にQiitaの記事を示す。

文書履歴は、該当記事の追記、訂正などを示す。


検討事項(agenda)


  1. cstdlibをまだincludeしていない事例有

  2. #define msgをまだ記述していない事例有

  3. N3242のURL(一覧も)を記載していない事例有

  4. 課題(agenda)を記載していない事例有

  5. tagをC++からC++N4606に変更していない事例有

  6. tagにg++, clang++を追加していない事例有

  7. hosted環境のプログラムであることを明記せず、freestanding環境ではどうすればいいかを記載していない事例有

  8. namespaceのカッコの中のタブ(空白)を生成しない。オプション未調査。


参考資料(reference)

N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること

https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)

https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較

https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

Qiitaに投稿するCのStyle例(暫定)

https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

MISRA C++ 5-0-16

https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp

https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed

ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)

https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

C言語(C++)に対する誤解、曲解、無理解、爽快。

https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識

https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS

https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました

https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認

https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか

https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include

https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

「C++完全理解ガイド」の同意できること上位10

https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671


文書履歴(document history)

ver. 0.10 初稿 10項目 20180418

ver. 0.11 コンパイルエラー・警告を記録する項目追加 20180418

ver. 0.12 タブ項目追加 20180418

ver. 0.13 文字コード 追記 20180418

ver. 0.14 astyleの利用 追記 20180418

ver. 0.15 実行結果の編集出力用のマクロ 追記 20180419

ver. 0.16 astyleすぐにパラメータを忘れるのでシェルスクリプトa.shに。20180420

ver. 0.17 コンパイルエラーに基づく3つ以上の分割方法を追記 20184022

ver. 0.18 「14 C++2003, C++2011 C++2017でのコンパイル」「15まとめ方」追記 20180427

ver. 0.19 課題、参考文献 追記 20180428

ver. 0.20 「namespaceのカッコの中のタブ(空白)を生成しない。オプション未調査。」を追記 20180428(携帯でコメント欄に記載。本文修正の上、コメント消しました。携帯の使い方下手なので。ごめんなさい。)

ver. 0.21 検討事項、document history, 符号 等字句修正 20180429

ver. 0.22 可変長templateを学ぶ 追記 20180816