Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

6.4.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)

この例では次の結果が生成され、ASCII の Control-L 文字に評価されます。

(037 & ’L’)

最良の解決策は、このマクロのすべての使用を次のように変更することです。

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

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