2011-03-13

Cのプリプロセッサーについてのtips集


プリプロセッサ処理のみを行う(gccの場合)

gcc -E a.c

マクロの引数について

  • ピリオド3つで可変長引数, __VA_ARGS__でその部分を展開
  • 引数の頭に#をつけると文字列表記(ダブルコーテーションでくくられる)
  • 引数の頭に##をつけると連結
#include <stdio.h> 
#define MY_PRINTF(...) fprintf(stderr, __VA_ARGS__)    
#define DEF(x, y) struct x##_##y##_t { static void f() { MY_PRINTF("%s, %s\n", #x, #y); } }  

DEF(foo, bar); 

int main(void) {     
    foo_bar_t::f();    
} 

みたいなことができる

#ifdefと definedの違い

#if defined(VAX) 

#ifdef VAX
と同じ。
definedの場合は
#if defined(VAX) && !defined(UNIX) 
みたいな書き方ができる

その他

  • マクロの名前は特に制限はない
  • 文字列やコメントの中にあるマクロ名は無視される
  • コンマのはいったを引数を一つにまとめたい場合はカッコでくくる

pragmaとかpredefinedなマクロ

  • 次回に続く(たぶん)




2010-11-25

MacBook Air 環境構築まとめ 追記

virtualboxの仮想環境についてちょっと設定が必要だったのでメモ


http://taksatou.blogspot.com/2010/11/macbook-air.html


仮想環境に対してSSH接続するにはvertualboxの設定からネットワークアダプタにブリッジアダプタを追加する必要がある。
そうしないと、ホスト側とアダプタを共有してしまうらしく、ゲストOS側にIPが割りあてられないみたい




ゲストOS側はubuntuがうまくやってくれるみたいでなにもしなくてOK

::

2010-11-24

MacBook Air 環境構築まとめ

MacBook Airを購入したら環境をさらすのが流行ってるみたいなので便乗です。
macは完全に初心者なのでいろんな所を参考にしつつとりあえずいれてみた。


- Xcode http://developer.apple.com/technologies/tools/xcode.html
開発者ならとりあえずいれておくらしい。

- iTerm http://iterm.sourceforge.net/
標準で付属しているTerminalだと256色が変だったのでこっちをつかうことにした。

- virtualbox http://www.virtualbox.org/
- ubuntu http://www.ubuntulinux.jp/products/JA-Localized/virtualbox
手元の環境は汚さずに仮想環境で開発するのがモダン。
VirtualBox用の仮想マシンイメージが配布されている。ただダウンロードしてvirtualboxを起動するだけ。
何もせずとも音もなるしバッテリ残量までわかる。youtubeもHD画質を要求しなければ余裕。

- AquaSKK http://aquaskk.sourceforge.jp/
mac移行ついでにIMEも移行する。

- FireFoxとか
各種ブラウザはとりあえずいれておく。
windowsからの移行はFEBEをつかった。
https://addons.mozilla.org/ja/firefox/addon/2109/

- passwordchest http://www.ohloh.net/p/passwordchest
シンプルなパスワードマネージャ。
個人的には絶妙な使用感。

- inputswitcher
いれてはみたけど端末に入力するときは英字モードにすればいいだけなのであまり必要性はなかった。

- eclipse
topcoderのSRMをやるのに便利。
日本語化するにはPleiadesをおとしてきて自分でPluginディレクトリとかコピーする必要がある。



さらに、CUI環境を充実させるために以下を行った。

- ddskk
AquaSKKだけだと端末入力時に不都合があるので。

- screen
macに標準で付属してるscreenは256color対応していないので自前でビルド。
本家のソースのままだとビルドできないので下記を参考にパッチをあてる。
http://writequit.org/blog/?p=183

configureは以下
./configure --enable-colors256 --prefix=~/Users/`whoami`/Documents/install --enable-rxvt_osc

自前ビルドしたバイナリは別のところにいれるようにすると安心感が得られる

- sudo sysctl -w net.inet.tcp.always_keepalive=1
公衆無線LANをつかってたら、ちょっと無操作なだけてすぐ接続がきれて不便だったので、これを設定してみたら治った。
微妙に不都合な時もありそうな気もするけど深く考えないことにする。

- zshrcとか
PATHとかを環境によって切りかえやすくするために、.zshrcに以下をかいて環境依存の設定は切り分ける。

[ -f ~/.zshrc.include ] && source ~/.zshrc.include

.zshrc.includeの本体は
work/git/local/dev/conf/.zshrc.include.air
とかのシンボリックリンクにしておく。
設定ファイルの実体はバージョン管理してるディレクトリにおいて、ホームディレクトリにはシンボリックリンクをおいておくと管理が楽だということに最近きづいた。

- .emacsとか
.zshrcと同様に切り替えやすさのためにかきかえた。
.emacsに直接設定を書くのではなく、以下のようにしてrequireするのがよさげ。
(require 'my-keybind)
(require 'my-emacs)
(require 'my-skk)
(require 'my-coding)

::

2010-10-20

makeでちょっと便利なメタプログラミング

GNU Make 第3版を見てたら、マクロとevalを使ってちょっと便利でおもしろいことができることに気づいた。

とりあえず例を書くとこんな感じ。
rules = foo bar baz

define def-rule
$1:
 @echo $1
endef

$(foreach i, $(rules), $(eval $(call def-rule, $i)))

マクロとevalを使えば動的にルールを生成できるのだ。
これだけでfoo bar bazの三つのルールがつかえるようになる。
便利!

これを使えばサブコマンドを受け付けるコマンドを使うルールを定義したい時とか、複数のディレクトリに対して処理を行いたい時に妥協したシェルスクリプトを書く割合が減る気がする。

ただし、マクロの中は二重に評価されてしまうので、makeの自動変数やfor文、シェル変数を使いたい時は$の個数に注意が必要
rules = foo bar baz

define def-rule
$1:
 @for i in foo*; \
 do \
 echo $$$$$$$$; \
 echo $$$$i; \
 echo $$@; \
 echo $1; \
 done
endef

$(foreach i, $(rules), $(eval $(call def-rule, $i)))
これはきもい

(※ $$はそのコマンドのpidを返すシェル変数。$@はそのルールのターゲット名を表すmakeの自動変数)


ZenBackWidget