|
|
|
| 2008/10/07 11:45||▲
|
|
|
地味な記事が続いていますが、今回お話しする<stdarg.h>で、C95のフリースタンディング環境で必要な標準Cライブラリは全てそろうことになります。この後は、もう少し地味なものが続きますが、C99のフリースタンディング環境で必要なヘッダを済ませてから、C90→C95→C99と実装を進めていきたいと思います。
まずは、va_list型の定義からです。このva_list型をどんな型にするかは、関数のコーリングコンベンションと深く関わります。参考までに"h8300-hms"ターゲットのコーリングコンベンションについて書かれたページをご紹介しておきます。
実際には、gccには<stdarg.h>の中の型やマクロの定義は、ビルトイン定義されているようです。
typedef __builtin_va_list va_list;
マクロに関しても同様です。
#define va_start(ap, last) __builtin_va_start(ap, last) #define va_end(ap) __builtin_va_end(ap) #define va_arg(ap, type) __builtin_va_arg(ap, type)
そして、C99で追加されたもう一つのマクロ、va_copyも同様です。
#define va_copy(d, s) __builtin_va_copy(d, s)
<stdarg.h>をC++に対応させるには、<stddef.h>がそうであったように、まずは<cstdarg>に上記の内容を記述し、<stdarg.h>からインクルードする必要があります。<cstdarg>では、va_listをstd名前空間の中で定義しなければなりません。
namespace std { typedef __builtin_va_list va_list; }
そして、<stdarg.h>では、std::va_listを大域的な前空間に導入します。
#include <cstdarg> using std::va_list;
これで、CにもC++にも対応した<stdarg.h>が出来上がります。
|
| 2006/01/25 20:51|その他のライブラリ|TB:0|CM:0|▲
|
|
|
コメント
|
|
コメントの投稿
|
|
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/13-870d8710
|
|
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|