2010-01-28

C++0x本:御免

C++0xには、説明を省いてもいいのではないかと思う機能も、いくつか存在する。

たとえば、registerやinlineは、もはやまともに使われてはいない。モダンなコンパイラは、ことごとく無視する。今や、この手の最適化に関しては、コンパイラの方が人間より賢いのである。

exportは、まともに実装しているコンパイラがない。

asmは、完全に無視されている。インラインアセンブリをサポートしているコンパイラでも、結局、独自の文法を使っているのである。

しかし、これらの理想主義を広げていくと、危険である。

long longはC99とかいう時代遅れの言語から取った機能だ。使うべきではないし、そもそも規格に入れるべきではなかったので解説しない。

volatileは何の役にもたたないので解説しない。

これらは、ある意味正しいのだが、long longやvolatileは、実際に型として認識される。これを解説しないのは問題がある。

extern "C"はどうか。私は、これも気にいっていない。単にC言語との互換性以外に、別言語と会話する場合に必要だという意見もあるかもしれない。しかし、現実はさらにややこしい。レジスタをどう使うか。スタックに引数をどのように積むか、などといった呼び出し規約は、規格外である。そもそも、レジスタやスタックなど、規格では規定されていないのである。純粋にextern "C"だけ説明しても、何の役にもたたない。

ページ数が足りないから割愛するならともかく、気に入らないから割愛、役に立たないから割愛というのは果たしてどうだろうか。しかし、具体的な環境がなければ意味をなさないこれらの機能を、ただ言語上の定義から解説しても、無意味である。

ここに挙げた以外にも、規格の上では定義されているが、実際何の役にも立たない機能は多数存在する。その機能の多くは、相当の年季の入ったC++プログラマも知らないのである。たとえば、テンプレートのデフォルト引数がマージされるような機能は、誰も知らないだろうし、知っていても、使いたいとは思わないだろう。関数ポインタの宣言時に、デフォルト引数を指定できるという機能は、C++0xで禁止された。

6 comments:

Anonymous said...

> ポインタの宣言時に、デフォルト引数を指定できるという機能

これって何? 概略でいいんで、教えてくれませんか。

江添亮 said...

今調べたら、C++0xではなく、C++03で、すでに禁止されていました。

こういうやつです

void f(int x = 0)
{

}

int main()
{
void (*fp)(int = 1) = &f ;

fp() ; // f(1)と同じ。デフォルト引数を変える事ができる。
}

C++98では、これができたのです。

Anonymous said...

知らないはずだよ。

この機能なら、C++98の時点で既にありません。

Unknown said...

> volatileは何の役にもたたないので解説しない。

え? そうなのですか?
UNIX上のC言語プログラムでは、シグナルハンドラと、そうでないコードの間で、同一の変数をアクセスする場合に必要となることがあります。
組み込み用途のC言語プログラムでも、割り込みハンドラと、そうでないコードの間で、同一の変数をアクセスする場合に必要となることがあります。
C++で、volatile を使わずにそういうプログラムを書く場合には、どうするのが正しいのでしょうか?

江添亮 said...

volatileの定義は、シグナルハンドラの中からでも使えることと、
積極的に最適化をしないということです。

前者はともかく、後者は、ただ積極的な最適化をしないというだけで、
じゃあ、具体的にどんな最適化をしないのか、ということは決められていないので、
到底、まともに使うことは出来ないのです。
そういうことがしたかったら、環境依存の拡張機能が使われるでしょうし。

結局、volatileというのは、Cから持ってきた機能なんですよね。
C++としては、シグナルハンドラというのは、あまりそぐわない、と個人的には思うのです。

Unknown said...

> 結局、volatileというのは、Cから持ってきた機能なんですよね。

もちろんそうですが、シグナルハンドラや割り込みハンドラを C++ で
書くのであれば、知っている必要のある機能なんだと思います。

> C++としては、シグナルハンドラというのは、あまりそぐわない、と個人的に
> は思うのです。

まあ、そういうニッチはいまだに Cの方が向いているのかもしれませんね。

いずれにせよマイナーな分野であるのは間違いないので、敢えて解説しない
ということに問題はないと思います。

ただ、「何の役にも立たない」という表現は引っかかりました。
そういうマイナーな分野に C++ を使っている人も、全くいないわけではない
と思うので。