C1X

GCC 4.6に追加された-std=c1xオプション

GCC 4.6には -std=c1x および -std=gnu1x オプションが追加されたことに、つい先ほど気付きました。具体的に、C1Xのどの機能が有効になるのかまではわかりません。

なぜ、凶悪なマクロプログラムに挑戦するのか

昨日のGCC拡張を用いたマクロプログラムもそうですが、私はこうやってときどき凶悪なマクロプログラムに挑戦しています。無い知恵を絞りながら、コンパイラの限界に挑むようなマクロをいろいろと考えています。さらには、コンパイラの限界を突破するために、PHPに前処理をさせるPCPのようなものまで持ち出しています。

RiSKさんによるC1Xのスレッドライブラリの翻訳

少し前から危ないRiSKのブログで進んでいたC1Xのスレッドライブラリの翻訳がひととおり終わったようです。
http://d.hatena.ne.jp/RiSK/20100520/1274321995

欲をいえば、単なる翻訳にとどまらず、POSIXスレッドとの比較など、さらにもう一歩踏み込んでいただきたいところですが、まずは「お疲れさま」といわせていただきます。

そういえば、ブログのタイトルから、いつの間にやら「うつ期ver.」というのがなくなっています。治ったとは思えないのですが...

_Static_assertのまねごと

危ないRiSKのブログ うつ期ver.「_Static_assert とは」という記事に触発され、私も_Static_assertのまねごとをやってみたくなりました。

まず、第二引数のメッセージ文字列を反映することは無理なので、エラーの検出を行う部分の真似だけにとどめることにします。C++のstatic_assertのまねごとは比較的簡単にカタがつくのですが、C99の場合には意外な問題が見えてきました。ひとつは、条件式が定数式でない場合にエラーにできるようにすること、もうひとつは構造体定義の中など、C1Xの本来の_Static_assertが使える文脈で使えるようにすることです。

C1XのBounds-checking interfacesの実装に挑戦したい...

まずは、C1XのBounds-checking interfaces が何なのかから説明します。簡単にいってしまえば、メモリへの不正アクセスをチェックできるようにしたライブラリ関数群のことです。大雑把にいえば、Visual C++ 2005 以降で登場した _s 付の関数の標準版のようなものです。

実は以前にも実装に挑戦したことがあるのですが、Visual C++.net 2003 への対応が難しかったので、そこで挫折してしまいました。というのも、Visual C++ 2005 以降であれば、ストリームの排他制御に用いる _lock_file 関数がユーザーに公開されているのですが、2003以前のバージョンでは非公開だからです。静的リンクの場合は強引に使ってしまうこともできるのですが、ランタイムライブラリをDLLにしたい場合はどうしようもありません(同じものを再実装するという手はありますが...)。

私の場合、Visual C++.net 2003 はまだまだ現役です。というのも、2005 以降だとデバッグモードが遅すぎて使えないことも多々あるからです。いろいろなチェックをやめればある程度は改善されるのでしょうが、IDEがそもそも重いので、2003で済む場合は2003を使いたいのです。

qsort_s と qsort_r と qsort_s

今になって気付いたのですが、Visual C++のqsort_sとGNU C Libraryのqsort_rとC1xのqsort_sは、中途半端に似ていて、しかも非なるものになっています。これらを使い分けるには、よほど注意しておかないと混乱してしまいそうです。

まず、Visual C++のqsort_sですが、次のような形式になっています。

void qsort_s(
    void *base,
    size_t num,
    size_t width,
    int (__cdecl *compare )(void *, const void *, const void *),
    void * context
);

次に、GNU C Libraryのqsort_rは次のような形式になっています。

コンテンツ配信