C

tiny_printf - 小さいprintf()を作る

目的 組込み用途などで、footprintが小さいprintf関数が欲しい。 ライセンスを気にしなくて良いように、縛りがゆるいものが良い。 結果 printf()の仕様の勉強を兼ねて、自作した。パブリックドメインにするので、扱いはなんでも可。 サイズ縮小のために、一…

hello-minimum - libcを使わずに hello world

目的 BINARY HACKS "HACK #26, glibcを使わないで Hello World を書く" のARM版を作りたい。 できるならサイズはとことん削りたい。 結果 ARM命令版で174バイト、Thumb-2命令版で154バイトの Hello World を作った。ポイントは以下: system call を直接呼出…

fifo-nonwait - FIFO をプロセス間の同期目的で使いたい

目的 Linux上のプロセスの同期待合せ処理として、処理がシンプルなFIFO(名前付きパイプ)を使いたい。 やりたいことは、μuITRONのイベントフラグ相当の処理。 外部仕様を書くと、 書込み側はいつでも書き込め、読み出し側のopenを待たずに次の処理を続ける …

tiny_printf - 小さいprintf()を作る

目的 組込み用途などで、footprintが小さいprintf関数が欲しい。 ライセンスを気にしなくて良いように、縛りがゆるいものが良い。 結果 printf()の仕様の勉強を兼ねて、自作した。パブリックドメインにするので、扱いはなんでも可。 サイズ縮小のために、一…

compound-literal - コンパウンドリテラル

目的 C99の拡張機能(GCCでも独自に拡張している)である、コンパウンドリテラルについて知る。 結果 コンパウンドリテラルとは、無名変数を記述する方法で、C99での拡張仕様。 文法的にはキャストと中括弧での変数定義を組み合わせて記述する。 gccでは、グロ…

signal-piping - SIGNALをpipe経由でハンドラからメインスレッドに渡す方法

目的 Linux上(UNIX全般)で「安全な」シグナル処理を実装したい。 本来シグナルハンドラでしてもよい処理は非常に限られており、実質は特定の型のグローバル変数操作と、非同期シグナルセーフ関数の呼び出ししか安全ではない(参考:UNIX上でのC++ソフトウェア…

multi-opts - gccの-Oオプションを複数個付けたらどうなるか?

目的 "gcc -O2 -O0" のように複数最適化オプションを付けた場合に、ちゃんと -O0 だけが有効になるかを確認したい。 結果 アセンブル結果を比較して、確かに、最後に付けた -O* だけが有効になっていた。以下、詳細。

c-effective Cソース中で、実際に使用されるコードを判別する(自作編)

目的 #ifdefが複雑にネストしているCソースファイル中で、どの部分が有効かを簡単に調べたい。 背景と動機については id:taiyo:20080202#p1 などを参照。 Cプリプロセスの部分適応ツールについては昨日(id:taiyo:20080204#p1)試したので、今回はそれ以外に…

cpp-tools - Cソース中の大量のifdefを読みやすくしたい(ツール探索編)

目的 #ifdefが複雑にネストしているCソースファイル中で、どの部分が有効かを簡単に調べたい。 背景と動機については id:taiyo:20080202#p1 などを参照。 結果 C FAQ(Question 10.18)で紹介されている3つのツールと、手元にあったツール1つを試した。 名前 …

cpp-undefined-macro - プリプロセッサの条件行での未定義マクロの働き

目的 未定義のマクロが、Cプリプロセッサの条件行でどう扱われるかを確認する 結果 未定義マクロXは、以下のように展開される。 defined(X) => 偽(結局は数値の0) マクロ展開 => 数値の0

cpp-macro-expand - プリプロセッサのマクロ展開の回数

目的 Cプリプロセッサでのマクロ展開は、再起的に可能か? 結果 不可能。一度展開したマクロは、展開結果にその内容が含まれていても、それ以上展開されない。 (Self-Referential Macros - The C Preprocessorに書かれている通りだった)

cpp-operators - Cプリプロセッサで利用可能な演算子を把握する

目的 Cプリプロセッサで、#if の行内で使える演算子がなにかを、漏れなく把握したい。 K&Rやウェブ検索では、適切に見つけられなかった。 結果 以下の演算子が使用可能(gcc-3.4.6の場合): 演算子 結合規則 備考 defined X (不明) (Xの前後に一重のみカッ…

c-operators - C言語で使用可能な演算子と優先順位

結果のみ C言語では以下が定義されている(はてな記法の制限のため、'|'だけ2バイト文字で表記している)。 演算子 結合規則 備考 () [] -> . 左から右 ! ~ ++ -- + - * & (type) sizeof 右から左 (単項演算子) * / % 左から右 + - 左から右 > 左から右 >=…

dump-macros - Cファイル内でdefineされているマクロ一覧を出力する

目的 Cのソースファイル中で、どの #ifdef が有効なのかを調べるために、そのソース内でのdefine済みマクロ一覧を簡単に取得する。 結果 gccのwrapperを作ることで実現できた。 オリジナルコマンドのファイル名をgcc-origに変更する マクロ表示用gccラッパー…