C++0xには、説明を省いてもいいのではないかと思う機能も、いくつか存在する。
たとえば、registerやinlineは、もはやまともに使われてはいない。モダンなコンパイラは、ことごとく無視する。今や、この手の最適化に関しては、コンパイラの方が人間より賢いのである。
exportは、まともに実装しているコンパイラがない。
asmは、完全に無視されている。インラインアセンブリをサポートしているコンパイラでも、結局、独自の文法を使っているのである。
しかし、これらの理想主義を広げていくと、危険である。
long longはC99とかいう時代遅れの言語から取った機能だ。使うべきではないし、そもそも規格に入れるべきではなかったので解説しない。
volatileは何の役にもたたないので解説しない。
これらは、ある意味正しいのだが、long longやvolatileは、実際に型として認識される。これを解説しないのは問題がある。
extern "C"はどうか。私は、これも気にいっていない。単にC言語との互換性以外に、別言語と会話する場合に必要だという意見もあるかもしれない。しかし、現実はさらにややこしい。レジスタをどう使うか。スタックに引数をどのように積むか、などといった呼び出し規約は、規格外である。そもそも、レジスタやスタックなど、規格では規定されていないのである。純粋にextern "C"だけ説明しても、何の役にもたたない。
ページ数が足りないから割愛するならともかく、気に入らないから割愛、役に立たないから割愛というのは果たしてどうだろうか。しかし、具体的な環境がなければ意味をなさないこれらの機能を、ただ言語上の定義から解説しても、無意味である。
ここに挙げた以外にも、規格の上では定義されているが、実際何の役にも立たない機能は多数存在する。その機能の多くは、相当の年季の入ったC++プログラマも知らないのである。たとえば、テンプレートのデフォルト引数がマージされるような機能は、誰も知らないだろうし、知っていても、使いたいとは思わないだろう。関数ポインタの宣言時に、デフォルト引数を指定できるという機能は、C++0xで禁止された。
6 comments:
> ポインタの宣言時に、デフォルト引数を指定できるという機能
これって何? 概略でいいんで、教えてくれませんか。
今調べたら、C++0xではなく、C++03で、すでに禁止されていました。
こういうやつです
void f(int x = 0)
{
}
int main()
{
void (*fp)(int = 1) = &f ;
fp() ; // f(1)と同じ。デフォルト引数を変える事ができる。
}
C++98では、これができたのです。
知らないはずだよ。
この機能なら、C++98の時点で既にありません。
> volatileは何の役にもたたないので解説しない。
え? そうなのですか?
UNIX上のC言語プログラムでは、シグナルハンドラと、そうでないコードの間で、同一の変数をアクセスする場合に必要となることがあります。
組み込み用途のC言語プログラムでも、割り込みハンドラと、そうでないコードの間で、同一の変数をアクセスする場合に必要となることがあります。
C++で、volatile を使わずにそういうプログラムを書く場合には、どうするのが正しいのでしょうか?
volatileの定義は、シグナルハンドラの中からでも使えることと、
積極的に最適化をしないということです。
前者はともかく、後者は、ただ積極的な最適化をしないというだけで、
じゃあ、具体的にどんな最適化をしないのか、ということは決められていないので、
到底、まともに使うことは出来ないのです。
そういうことがしたかったら、環境依存の拡張機能が使われるでしょうし。
結局、volatileというのは、Cから持ってきた機能なんですよね。
C++としては、シグナルハンドラというのは、あまりそぐわない、と個人的には思うのです。
> 結局、volatileというのは、Cから持ってきた機能なんですよね。
もちろんそうですが、シグナルハンドラや割り込みハンドラを C++ で
書くのであれば、知っている必要のある機能なんだと思います。
> C++としては、シグナルハンドラというのは、あまりそぐわない、と個人的に
> は思うのです。
まあ、そういうニッチはいまだに Cの方が向いているのかもしれませんね。
いずれにせよマイナーな分野であるのは間違いないので、敢えて解説しない
ということに問題はないと思います。
ただ、「何の役にも立たない」という表現は引っかかりました。
そういうマイナーな分野に C++ を使っている人も、全くいないわけではない
と思うので。
Post a Comment