Oracle Solaris Studio 12.2: C ユーザーガイド

6.5.5 文字列の使用


注 –

ISO C では、-xtransition オプションを使用するとき、次の例 (?) を使用すると、古い機能を使用しているという警告が生成されます。移行モード (-Xt-Xs) の場合のみ、結果は以前のバージョンの C と同じになります。


K&R C では、次のコードは文字列リテラル「"x y!"」を生成しました:


#define str(a) "a!"   ?
str(x y)

プリプロセッサは、文字列リテラルと文字定数の内部で、マクロパラメータのように見える文字を検索していました。ISO C はこの機能の重要性を認識していましたが、トークンの部分にこの操作を行うことはできませんでした。ISO C では、前述のマクロの呼び出しはすべて文字列リテラル「a!」を生成します。ISO C で以前の効果を得るためには、# マクロ置換演算子と文字列リテラルの連結を使用してください。


#define str(a) #a "!"
str(x y)

前述のコードは、2 つの文字列リテラル "x y" "!" を生成し、 連結したあと、同じ文字列 "x y!" を生成します

文字定数用の操作を完全に代用するものはありません。この機能の主な使用方法は次のようなものでした。


#define CNTL(ch) (037 & ’ch’)    ?
CNTL(L)

これは、次を生成します。


(037 & ’L’)

これは、ASCII の Control-L 文字と同じです。最良の解決策は、このマクロを次のように変更することです。


#define CNTL(ch) (037 & (ch))
CNTL(’L’)

このコードの方が読みやすく式にも適用できるため、より使いやすくなっています。