リンク
0回目:こ↑こ↓
1回目:どうぞどうぞぉ!ゆっぐりしてってぇ↑!(string::substrのお話)
はじめに
みんな!規格読んでるかい?
僕は最初に習った言語がJavaだったこともあり(いや、関係あるのか?)、基本的に言語にAPIなりDocなりが付いてこないと気が済まない変質者ならぬ偏執者です。該当する一般名詞が思いつかないのでとりあえず原著オタクというタグを付けておきました。やはり原著を読むことは大事ですよね。教科書も翻訳版を忌み嫌う人です(翻訳家の皆様には申し訳ない)。
課題やら競プロやらでCやC++を使っている僕ですが、これらの規格も紐解くのに少々手間がかかるぐらいでそんなに難しくはないので、Stack Overflowに納得いかなかったらちょびちょび読んでます。
そうとはいえ規格が全部頭に入るほど記憶力が良くないので、備忘録としてC規格やC++規格の読み解いた部分を少しずつ記事にしていこうと思います。全部**規格の参照込み!**を目指します。形式としては毎回気になるところが気まぐれなので一問一答で一記事にしようと思います。割と当たり前のことを敢えて規格に問い質すことが多いので、非自明な事実が明らかになるシリーズではありません。多分。
そして大層なことを言っておいてアレですが恐らくC++の話の方が多いと思います。Cはそんなに使ってないので(おい
C規格
Cの規格はISO/IEC JTC1/SC22/WG14というグループが作っています。出来上がった規格は有料で、途中経過も大体内部でしか見られませんが、規格一覧に2011-04-12付のC11規格の下書きにあたるWG14 N1570(PDF)が無料公開されています。ケチなので有料の規格ではなくこれを使います。もし規格で変わってる部分について言及してしまった場合はご容赦ください。
C++規格
同様に、C++の規格はISO/IEC JTC1/SC22/WG21が作っています。WG14がWG21になっています。(気になって調べたところ、WG15-20はそれぞれ
WG15: POSIX
WG16: ISLISP(ISO版LISP)
WG17: Prolog
WG18: FIMS
WG19: 形式手法とかメタ言語(Extended BNF, VDM, Z Notation)
WG20: 規格の国際化
をやっている(いた)っぽいです。詳しくはJTC1/SC22のページまで。)C++11規格の下書きは規格一覧より2011-02-28付のWG21 N3242(PDF)なのですが、実はホームページに2013-10-13付のWG21 N3797(PDF)があるのでこちらを使おうと思います。ちなみにC++14のリリースは販売ページによると2014年12月らしいので1年ちょい分の修正が抜けています。こちらも規格で変わってる部分について言及する可能性があるのでご容赦を。
追加コンテンツとしてN3242とN3797で該当箇所が変化しているか確認するかも?しれません(面倒なので多分しない)。
手元で一緒に開いて追従してくれる場合は、よほどC++11が気にならない限りはN3797をオススメします。特にMacBookを使っている方なんかはPreviewで開く方が多いと思いますが、N3242が10.6 MBなので開くとPreviewがしばらく固まります。N3797は5.2 MBで固まらないです。(ファイルサイズのみが原因なのかはよくわかりませんが。)
2017-04-27: @yumetodo さんのコメントを踏まえて(第1弾はもう書いちゃいましたが)使用する規格を変更します!
- C++11に関してはN3337(公式(PDF)・Github(PDF)(両者中身は一緒です。))、
- C++14はN4140(PDF, Github) +
N4140→N4141の差分(Github)の合わせ技
にします。N3337はC++11の正式な規格の次に公開された(、一応C++14の規格の)下書きです。直後なのであまり変更点が無いことを願いつつ使用します。(少なくとも「C++11規格にあるものがドラフトに無い」状況は回避できるので、こっちの方が適しているとは思います。)N4141はマジで有料の規格と中身一緒です。(公式サイトではN4140もN4141もアカウント認証で鍵かけてるのにGithub上でなぜ公開してるかはしーーーらないっ!)PDFとして直接公開されているのはN4140なので、(そしてN4140→N4141の違いは細かい修正ぐらいなので、)手元に置くのはN4140であるものの、記事内ではN4141として引用し、もしN4140→N4141でちょうど変更された点を引用する場合は追記しておきます1。
(尚、第1弾に関しては気が向いたら更新しておきます。)
実験(実証)環境
たまにコードをちゃんと書いてコンパイルさせてみたりします。その際は以下の環境を使っているので参考にしてください。
GNU Compiler Collection (Homebrew):
gcc-6 (Homebrew GCC 6.3.0_1 --without-multilib) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
---
Clang (Xcode Command Line Tools):
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
脚注
-
それN4141コンパイルすりゃええねんというツッコミはかなりごもっともなんですが、記事を追うのにわざわざコンパイルしたくない人とかいそうなので、ブラウザ一つで追従までできる記述がいいかな?というお節介の産物です。 ↩