タグ

cとpreprocessorに関するtyruのブックマーク (4)

  • プリプロセッサで足し算しましょう! - デ-mk6

    プリプロセッサは所詮文字列置換、計算なんてできやしない…そう思っている方は多いでしょう。しかしそれは違います。計算できます。 日の目的はプリプロセッサで足し算です。ADD(3, 2)と書けば5と答えてくれる関数マクロを作ってみましょう。 おっと、#define ADD(m, n) ((m) + (n)) とかではありません。これで足し算をするのは誰か、それはコンパイル・実行したときの処理系です。 今日の目的はあくまでも、プリプロセッサという処理系に閉じた足し算を定義することです。言い換えればプリプロセスが終わった時点で結果がでていないといけません。あとなんか細かいことはある感じがしますが、もうめんどいので早速始めましょう。 まずプリプロセッサにおける数を取り決めておきます。数とは、数字のみで構成されたトークンのことです。数字とは、トークンとは何かなどはめんどいので常識的に考えてください。

    プリプロセッサで足し算しましょう! - デ-mk6
    tyru
    tyru 2016/12/19
    記憶には残ってたけどブクマしてなかった…
  • Boost.PreprocessorはCでも使える - Faith and Brave - C++で遊ぼう

    【preprocessor】 Can it be used with C? C90標準に従っているコンパイラなら動くはず、と。

    Boost.PreprocessorはCでも使える - Faith and Brave - C++で遊ぼう
  • コンパイル時アサート-C/C++-水無瀬の部屋

    マクロ c_assert() は定数式についてコンパイル時にマクロ assert() と同等の働きをするものです。 マクロ c_assert() は定数式 expression が 偽 の場合にコンパイルエラーを発生させます。 たとえば次のような前提条件を検査できます。 // 明示的な符号指定がない型 char は signed char と仮定した c_assert( is_signed(char) ); // 右シフトが算術シフトである処理系を仮定した c_assert( -1 == (-1 >> 1) ); // 1 バイトが 8 ビットである処理系を仮定した c_assert( 8 == CHAR_BIT ); // 型 int が 32 ビット以上であると仮定した c_assert( 32 <= (CHAR_BIT * sizeof(int)) ); マクロ c_assert()

    tyru
    tyru 2009/11/19
    Cでも(もちろんC++でも)使えるコンパイル時アサート
  • Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ

    今年の文化祭で書いた記事です。 - C言語といえば、いやなイメージ、過去の遺産といった感じがあるかもしれません。 C言語のネガティブな側面というと、やはりポインタやメモリ管理などが難しい、ということが思いつくかもしれません。 しかし、C言語のポインタは表記に騙されやすいだけで、仕組み自体は全く難しくありません。 文法も、どこぞのPerlC++と比べたら屁でもない単純さです。 実のところ、仕様が煩雑で難しいのは、Cプリプロセッサなのであります。 普段からあまり複雑な使いかたをしないから気づかないかもしれませんが、Cプリプロセッサの置換処理は、欺瞞と裏切りに満ちた世界なのです。 これが進化するとテンプレートなどといったもっと面白いものになるのですが、今回はCプリプロセッサで計算をしちゃったりするところまで試しにやってみましょう。 (なお、GCCにより実験的に調べた記事なので、他のCコンパイラ

    Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ
  • 1