picox  0.1
Xcompiler

コンパイラごとの依存機能を吸収します [詳解]

Xcompiler 連携図

マクロ定義

#define EOF   (-1)
 
#define NULL   ((void*)0)
 
#define X_ALWAYS_INLINE   static inline
 コンパイラに対して、関数のインライン展開を強制するキーワードです。 [詳解]
 
#define X_COMPILER_C99   (0)
 コンパイラがC99に対応しているかどうか
 
#define X_DEPRECATED
 指定の定義が廃止予定や非推奨であることを表明するコンパイラディレクティブです [詳解]
 
#define X_FUNC   __func__
 
#define X_GNUC_PREREQ(maj, min)   0
 GCCのバージョンがn.m以上かどうかを返します
 
#define X_HAS_STATEMENT_EXPRESSIONS   (0)
 {}で囲まれた複合文と変数の宣言を()の式の中で使用できるかどうか [詳解]
 
#define X_HAS_TYPEOF   (0)
 コンパイラがtypeof拡張に対応しているかどうか [詳解]
 
#define X_HAS_VARIADIC_MACROS   (1)
 コンパイラが可変長引数マクロに対応しているかどうか [詳解]
 
#define X_INLINE   static inline
 コンパイラに対して、関数のインライン展開を指示するキーワードです。 [詳解]
 
#define X_LIKELY(x)    x
 条件分岐に使用するコンパイラ最適化ディレクティブです [詳解]
 
#define X_MEMORY_BARRIER
 メモリ動作の順序性を制御するCPU命令です
 
#define X_UNLIKELY(x)    x
 条件分岐に使用するコンパイラ最適化ディレクティブです [詳解]
 
#define X_UNREACHABE   for (;;)
 以下のコードには決して到達しないことを表明するコンパイラディレクティブです
 

詳解

コンパイラごとの依存機能を吸収します

コンパイラごとに独自の拡張機能があったり、同じ機能でも構文が違ったり、C標準 (特にC99)で未サポートの機能があったりと、コンパイラ非依存のプログラムの記述 は相当大変です。このモジュールが提供する機能を利用することで、その負担を軽減 できます。

マクロ定義詳解

#define X_ALWAYS_INLINE   static inline

コンパイラに対して、関数のインライン展開を強制するキーワードです。

コンパイラがこの機能をサポートしていれば、最適化レベルや、関数の内容に関わら ず、必ずインライン化されるようにします。

#define X_DEPRECATED

指定の定義が廃止予定や非推奨であることを表明するコンパイラディレクティブです

コンパイラがこの機能に対応していれば、DEPRECATED指定の定義が使用されている場 合、コンパイル時に警告が出力されます。 関数以外にも、型定義や、変数にも使用することができます。

1 X_DEPRECATED void deprecated_func(void);
2 X_DEPRECATED typedef int deprecated_type_t;
#define X_HAS_STATEMENT_EXPRESSIONS   (0)

{}で囲まれた複合文と変数の宣言を()の式の中で使用できるかどうか

これに対応していると以下のような無茶なことができます。

if ({ func1();
if (x) // if の中に ifも書ける
...
else
...
1; // 最後の式がifの判定に使用される
})
...
覚え書き
これが標準でサポートされると、相当面白いことができそうなんですが、まあされな いでしょう。プログラムがGCC限定でいいなら、使ってもいいかも。
#define X_HAS_TYPEOF   (0)

コンパイラがtypeof拡張に対応しているかどうか

X_HAS_TYPEOF == 1の場合、X_TYPEOF()が使用可能です。

#define X_HAS_VARIADIC_MACROS   (1)

コンパイラが可変長引数マクロに対応しているかどうか

覚え書き
特に気をつけるべきなのが、CコンパイラがC99に対応していても、C++だと使えない というケース(例 Renesasコンパイラ)があることです。C++が可変長引数マクロに正 式対応したのはC++11からなので、まあ規格準拠ではありますがちょっと納得がいか ない・・・。
#define X_INLINE   static inline

コンパイラに対して、関数のインライン展開を指示するキーワードです。

実際にインライン展開されるかどうかは、コンパイラが判断します。

#define X_LIKELY (   x)    x

条件分岐に使用するコンパイラ最適化ディレクティブです

参考サイト
http://d.hatena.ne.jp/tkuro/20110114/1294956535

#define X_UNLIKELY (   x)    x

条件分岐に使用するコンパイラ最適化ディレクティブです

参照
X_LIKELY