表紙
/
自作ソフト
/
日記
/
宝箱
/
サイト情報
/
検索
一般 / 新C言語 / 駄文 |
| |
|
|
本章では、プリプロセッサに新たに加わったいくつかの機能と、プリプロセッサに対する変更点について説明します。 2.1 新しいコメント表記方法 今までのプログラミング言語 C でのコメントの表記法は、/* */ という表記を用いていました。次の例では、青色の部分が示している部分、つまり /* で始まり */ で終わる部分がコメントとして扱われました。
一度コメントが始まれば、改行してもコメントは続きます。コメントを終わりにするためには、*/ を記述する必要があります。ここで一つ気をつけなければならないことがあります。それは、コメントのネストはできないということです。例の最後の行を見るとわかるように、最後の 「は不正*/」 がコメントからはみ出してしまい不正になっています。 従来はこの表記方法しかなかったのですが、この表記方法では一行ですむようなコメントを入力する時にはわざわざ閉じるための */ を入力する必要があり、面倒です。そこで新しいコメント表記法 // の導入です。// を使って書き直した例を次に示します。
見ればわかると思いますが、// 型のコメントは、// から始まり、行末までです。従って、例の最後の表記法のようなこともできます。この表記法ならば、/ を二回軽くたたくだけなのでコメントの入力が簡単になります。したがって、プログラマも気楽にわかりやすいコメントを入力できるようになるでしょう (?)。なお、一応言っておきますが従来型のコメントも引き続き利用可能です。 さて、最後におまけですが、この // という表記法は、プログラミング言語 C++ でのコメントの表記法でもあります。さらに言えば、プログラミング言語 C の祖先となる言語の、プログラミング言語 B でのコメントの表記法でもあります。つまり、コメント表記は先祖帰りをしたというところでしょうか。 2.2 空引数を許された関数型マクロ呼出し 今までのプリプロセッサでは、関数型マクロを利用するときには、その中に必ず引数を書く必要がありました。例えば、ある値とあるアルファベットを指定するとその二つをくっつけた値に置き換えるマクロを考えましょう (数値の後ろに 'L' の記号を付加して long 型の整数定数にするような場合を考えてください)。しかし、場合によっては、そのアルファベットは不要です(int 型の整数定数には記号は必要ありません)。 今までのプリプロセッサでは、関数型マクロで定義された引数には必ず値を指定する必要がありました。このような要求を満たすためには、従来のプリプロセッサでは、次の例のように記述する必要がありました。
例の中の赤字の部分は規格の範囲内の記述ではできないものです。もし記述するとその振る舞いは未定義になります。しかし、今度の C 言語の仕様によるプリプロセッサでは、関数型マクロ引数に何も引数をかかなくてもよい形式が許されるようになりました(empty macro arguments)。従って、前述の例は新しいプリプロセッサでは、次のように記述することができます。
このように、今度のプリプロセッサでは応用の範囲が少し広がることになりました。 2.3 可変個数引数を持つマクロ定義 結構ある要求の一つに、printf のカスタムバージョンを簡単に作りたいというものがありました。例えば、dbg("ok value=%d", val); というようなマクロを呼び出すと、最終的に、printf("debug:ok value=%d", val); のように展開したいというものです。このような方法を実現するためには、今まではいくつかの妥協が必要でした。
しかし、今度の仕様のプリプロセッサを使えばこのような可変個数引数を持つマクロが簡単に作成することができるようになるのです。
まず、可変個数引数を持つマクロでは、個数を可変にしたい部分に省略を示す記号「...」をおきます。これは C 言語の省略の記号と同じもので、引数リストの最後にしか置くことができません。この関数型マクロを使うときには、この省略の部分には、まったく引数をかかなくてもいいし、いくつも書いても許されます。また、(1)のように一つも固定部分がないマクロも可能です。そして、マクロの右側ではその部分はマクロ「__VA_ARGS__」でその内容を参照することができます。 これでプリプロセッサがますます使いやすくなりましたね。 2.4 あらかじめ定義されているマクロ名 C プリプロセッサでは、あらかじめ定義されているマクロ名があります。これらは事前に定義されているのですぐに参照可能です。従来の C プリプロセッサでも 5 つのマクロ名が定義されていました。その後、9899/AMD1:1995 で 1 つのマクロが追加されました。そして今回新しく 3 個のマクロが定義されました。それらは、次の通りです。
今回の追加では拡張機能に関する項目が多いことが特徴です。 2.5 プログラミング言語 C 標準プラグマ 今までの C 言語では、C プリプロセッサにおいて pragma という指令を設けて、それを使用することでベンダ定義の指令を与える方法を定義していました。しかし、これには標準 C 言語自身が提供するプラグマは含まれませんでした。今度の C 言語では、STDC というプラグマを決定し、このプラグマを使用することで標準 C 言語のプラグマを提供することにしました。このプラグマを利用して提供される標準 C 言語のプラグマは以下の通りです。
新たに定義されたものは、浮動小数点や複素数関係なのでそれらを使わない人はめったに使うことはないでしょう。 2.6 単項演算子 _Pragma プラグマはベンダが勝手に定義していくもので、もちろん標準化はされていません。しかし、ベンダ間で同じような機能を持つプラグマが異なった表記法によって定義されることがあります。例えば、そのマシンで多少制限はあるがより高速に呼び出す方法があるとしましょう。このプラグマは直後の関数一つを修飾するものとします。このような場合、移植性のあるソースプログラムにするには、プラグマを次のように使用するしかありませんでした。
pragma を使用するたびにこのような表記法を使用する必要があります。しかし、この表記ではソースプログラムが非常に見づらくなります。では、より簡単にするために、#if ... #endif の間を別のファイルにして、それを #include するという方法も考えられます。しかしそれぞれのプラグマ用のファイルを作成するのは管理と手間の上で面倒で、しかも美しくありません。今度のプリプロセッサから使用できるプリプロセッサ _Pragma 単項演算子を使用するとこのような問題を解決することができます。
このように、簡潔に記述することができるようになります。なお、_Pragma の引数に書けるのは文字列定数だけです。つまり、_Pragma("プラグマ指令") という表記だけです。 2.7 プリプロセッサ式における整数型 プリプロセッサでの #if 式 といった、式の中では整数の演算をすることができます。従来のプリプロセッサでは、符号付きの演算では long 型、符号なしでは unsigned long 型で計算がなされました。しかし、そのアーキテクチャで、long 型よりもっと大きな整数型が必要になり、そのためにベンダが独自に新たな整数型を定義したりしているときも、プリプロセッサ中ではそれよりも小さな値しか表現できない long 型で計算するしかありませんでした。 新しいプリプロセッサでは、符号付きの演算では intmax_t 型で、符号なしでは uintmax_t 型で計算することになりました。intmax_t, uintmax_t は、今度の C 言語で新たに導入された stdint.h の中で定義される型で、この処理系の中で表現されうる最大の数を表現できる符号付き/符号なし整数の型です。 2.8 文字列定数とワイド文字列定数の結合 C 言語では、並んだ二つの文字列定数は一つの文字列定数に併合する決まりになっています。例えば、文字列定数 "hoehoe " と文字列定数 "room" が並んでいれば、その二つを結合した文字列 "hoehoe room" に、ワイド文字列定数 L"hoehoe " とワイド文字列定数 L"room" が並んでいれば、結合されたワイド文字列定数 L"hoehoe room" に変換されます。しかし、文字列定数とワイド文字列定数に関する結合に関しては未定義の動作となっていました。 今回の C 言語では、文字列定数とワイド文字列定数は結果として、単一のワイド文字列定数になることになりました。これは、ワイド文字列を使用した関数で、新たに余計なマクロを定義しなくてもすむようにするためです。例えば、inttypes.h で定義されているマクロ PRIxFAST32 などを使うことを考えます。もし今回の決定が無ければ、ワイド版のマクロを別に定義する必要にせまられますが、今回の決定により、wprintf ( L"val=%"PRIxFAST32"\n", intfast32val ) のように何ら不自然ではなく記述することができます。 *構文として定義されていないので、プリプロセッサの機能として分類してあります |
|
| ||||
表紙
-
著作権
-
注意事項
-
リンクについて
-
404 エラーについて
(c)1999-2014 seclan. All rights reserved. |