マクロをdo-while(0)で囲むワケ
こんな感じで書かれたマクロを見ることがある。
#define SWAP(x, y) do { int temp = x; x = y; y = temp; } while(0)
do-while(0)で囲んでいるのは、ブロックで囲まれていないif文での意図しない動作を防ぐため。
例えば、以下の場合に有効。
/* do-while(0)で囲まれていない場合 */ #define SWAP(x, y) { int temp = x; x = y; y = temp; } if (hoge) SWAP(x, y); else x = 0;
これは、以下のように展開され、文法エラーになる。
if (hoge) { int temp = x; x = y; y = temp; } ; else x = 0;
文法エラーで済むのならいいけど、以下の場合には意図しない制御になり致命的。
if (1) if (1) SWAP(x, y); else ;
ちなみに、if文を{}で必ず囲めば、マクロをdo-while(0)で囲む必要もなく全て解決。
ifは必ず{}で囲もう。
参考ページ
Super Technique 講座〜マクロの技
rootユーザのPATHを設定する
sudoすると、root用のPATHに切り替わってしまう。
これはmake installなどの時にいろいろ不便。
で、root用のPATH設定は/etc/environmentで行える。
Ubuntuでsuを有効化
Ubuntuで、suコマンドを有効化する方法。
Electronic Genome - Ubuntuでsuを使えるようにする
Ubuntuはrootのパスワードが設定されていないから、suが使えないとのこと。
$ sudo passwd root
で、rootのパスワードを設定してやればsuを有効にできる。
12ステップで作る組込みOS自作入門(1)
仕事で組み込み開発をしていても、組み込みOSの深いところまではなかなか入っていけてないので、以下の本で組み込みOS「kozos」の学習を開始した。
独自OSを作ってみよう!
1stステップ:開発環境の構築
開発環境の構築は、クロス開発環境の構築 - ryochack.clipboardで行ったh8300環境がそのまま使用できる。
ハマったのが、H8/3069FのフラッシュROMへのh8writeでの書き込み。
こんなエラーが出て書き込めない。
$ sudo make write FATAL:Can not open the line to the H8/OS system.
スーパー・ユーザ権限でやっても解決せず*1、Ubuntuを再起動してもダメ*2。
うんうん唸って、ダメ元でシリアルケーブルを全部接続し直したら、書き込みできた。
$ sudo make write /usr/local/bin/h8write -3069 -f20 kzload.mot /dev/ttyUSB0 H8/3069F is ready! 2002/5/20 Yukio Mituiwa. writing WARNING:This Line dosen't start with"S". Address Size seems wrong WARNING:This Line dosen't start with"S". Address Size seems wrong ..... EEPROM Writing is successed.
シリアルケーブルの初期化あたりの問題かな?
とにかく、これでようやくスタートライン。
※シリアルケーブルを抜き差ししてもダメな場合は、 shintaさんが公開されている改良版の「kz_h8write」を試してみるのがいいと思います。
*1:dfltweb1.onamae.com – このドメインはお名前.comで取得されています。
*2:12ステップ本に記載
grep結果のquickfixからEnterキーで飛べるようにする
vimgrep後のquickfixリストは編集不可になっていて、いちいち編集許可を与えないとEnterキーでカーソル下の箇所へ移動できない。
それが不便でしょうがなかったので、以下を.vimrcに追記。
" quickfix: 編集許可と折り返し表示無効 function! OpenModifiableQF() cw set modifiable set nowrap endfunction autocmd QuickfixCmdPost vimgrep call OpenModifiableQF()
これですごく快適になった。
quickfixのヘルプドキュメント、知らないことばかりだったので今度ちゃんと読もう。
Google サイト
って、ちょこっと読んだら、以下の記載が。
":.cc" とかあったんだ…
QuickFixウィンドウには各行に1個ずつエラーが表示される。その行数はエラー番号に
等しい。":.cc"でカーソル下のエラーに移動できる。キーを押すのと行をダブ
ルクリックするのは同じ効果がある。そのエラーを含むファイルがQuickFixウィンドウ
の上に開かれる。
関数ポインタで型情報の異なる関数を実行する -引数省略-
これ、知らなかった。
bÅÍøȪÌÖè`fnc( )Ífnc(void)ÅÈfnc(...)
続きを読むC言語において
int fnc( )
という引数を省略した表現は、
int fnc(...)
という、引数がいくつあってもよい、という意味になる ... が省略されている状態であって
int fnc(void)
のような、引数が一つもない、という意味の宣言ではありません。