知らないうちにMinGWのprintfがまともになっていた。
先日までGCCで日本語文字列がどうのこうのということを書いていましたが、その過程でMinGWをいろいろ調べることになりました。その際に、MinGWのprintf系関数がずいぶんまともになっていることに気付きました。
MinGWのランタイムライブラリは、C99で追加されたようなものを除けば、msvcrt.dllに依存してます。これはMIcrosoft Visual C++ 6.0のライブラリです。C99に対応していないのはもちろん、long double型がVC++では64ビット、MinGWでは96ビットと異なることが原因で、"%Lf"などのlong double型用の書式が正しく動作しませんでした。
この機能はまともに動いてほしい
GCCもどんどんバージョンアップして、今では4.6.0が最新版になっています。その過程で、C++0Xや(少しだけですが)C1Xへの対応も進んでいるわけですが、本来であればとっくに対応できていなければならないはずの機能がいまいちだったりもします。
[C99] 第11回 その他、細部のちがい
ここでは、他の回で採り上げなかったC++とC言語の細かなちがいについて解説します。
可変個の実引数を取る関数の仮引数並び
C++では、printf 関数のような可変個の実引数を受け取る関数の仮引数並びを次のように記述することができました。
しかし、C言語では、必ず ... の前にコンマを記述する必要があります。
[C99] 第10回 メモリの動的割付け
メモリの動的割付け、あるいはオブジェクトの動的生成の方法は、C++とC99では大きく異なります。
GCC拡張を使ったスマートポインタ
前回はcleanup属性を使ってデストラクタのような機能を実現する方法を取り上げました。今回はその応用として簡易的なスマートポインタを作ってみました。auto_ptrという名前を付けましたが、scoped_ptrのほうが適切だったかもしれません。
[C99] 第9回 リテラル
リテラルについても、C++とC99では微妙なちがいがあります。
[C99] 第8回 構造体と共用体と列挙体
C99にクラスはありませんが、構造体と共用体ならあります。また、C++と同様、列挙体も使うことができます。
Cの初期化子
以前、「C言語でnewもどきを作ってみる。」という記事を書きました。そのときは、GCC拡張を持ち出すつもりはありませんでしたので、なるべくC99の範囲に収めようと努力したつもりです。
なぜ、凶悪なマクロプログラムに挑戦するのか
昨日のGCC拡張を用いたマクロプログラムもそうですが、私はこうやってときどき凶悪なマクロプログラムに挑戦しています。無い知恵を絞りながら、コンパイラの限界に挑むようなマクロをいろいろと考えています。さらには、コンパイラの限界を突破するために、PHPに前処理をさせるPCPのようなものまで持ち出しています。
[C99] 第7回 修飾子と記憶クラス指定子
C99にもC++と同じ修飾子(const および volatile)や記憶クラス指定子(extern, static, auto, register, および typedef)が備わっています。ただし、mutable 記憶クラス指定子はありません。逆に、C++にはない restrict 修飾子があります。また、微妙に仕様が異なるものがあるため、ここではそれらについて解説します。