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なマクロ

  • 次回に続く(たぶん)




0 件のコメント:

コメントを投稿

ZenBackWidget