4.1.2 未定義の項目

この項では,ANSI規格における未定義の項目について説明します。

(1)

文字集合

ソース・ファイルに文字集合として定義された文字以外がある場合,メッセージを出力します。

(2)

字句要素

文字“ ' ”,または文字“ " ”がその最後の分類(区切り子,および字句的にほかの前処理字句の種類に一致しない単一の非空白類文字)に入る場合,メッセージを出力します。

(3)

識別子

識別子全文字を意味がある文字とするため,意味のない文字は存在しません。

(4)

識別子の結合

翻訳単位の中で同じ識別子が内部結合と外部結合の両方で現れた場合,警告を出力します。記憶域クラス指定子なしの宣言がある場合は外部結合にします。記憶域クラス指定子なしの宣言がなく,static記憶域クラス指定子とextern記憶域クラス指定子が混在する場合は内部結合にします。

例 1.

int xxx;
static int xxx;    // 警告を出して,xxxは外部変数にする

例 2.

static int xxx;
int xxx;           // 警告を出して,xxxは外部変数にする

例 3.

extern int xxx;
static int xxx;    // 警告を出して,xxxはstatic変数にする

例 4.

static int xxx;
extern int xxx;    // 警告無しで,xxxはstatic変数にする

例 5.

extern int xxx;
static int xxx;    // 警告を出して,xxxは外部変数にする
int xxx;           // 警告を出して,xxxは外部変数にする

(5)

適合型と合成型

同じオブジェクト,または関数を参照するすべての宣言は,適合しなければなりません。同一翻訳単位内で適合しない場合は,メッセージを出力します。それ以外の場合は,未定義とします。

(6)

文字定数

特定の非図形文字は,\に続く英小文字から構成する拡張表記\a,\b,\f,\n,\r,\t,および\vによって表現できます。その他の拡張表記はもたず,\に続く文字は,その文字自身とします。

(7)

文字列リテラル−結合

単純文字列リテラルとワイド文字列リテラル字句が隣り合うとき,結合してワイド文字列リテラルとします。

(8)

文字列リテラル−変更

文字列リテラルの変更はユーザ責任となります。

(9)

ヘッダ名

文字,',",//,または/*が,区切り記号<と>の間の文字列中,または2つの区切り記号”の文字列中に現れた場合は,そのままファイル名として扱います。\文字はフォルダ区切りとして扱い,エスケープ文字として解釈しません。

(10)

浮動小数点型と汎整数型

浮動小数点型の値を汎整数型に型変換する場合,整数部の値が汎整数型で表現できなければ,未定義とします。

(11)

左辺値および関数指示子

左辺値が不完全型を持ち,配列型を持たない場合は,未定義とします。

(12)

関数呼び出し−引数の個数

実引数と仮引数の個数が等しくない場合,未定義とします。

(13)

関数呼び出し−拡張後の引数の型

関数原型を含まない型で関数を定義し,かつ拡張後の実引数の型が,拡張後の仮引数の型と一致しない場合,未定義とします。

(14)

関数呼び出し−適合しない型

呼び出される関数を表す式によって指される型と適合しない型で関数が定義されている場合,未定義とします。

(15)

関数呼び出し−適合しない型

関数原型を含む型で関数を定義し,かつ拡張後の実引数の型が仮引数の型と適合しない場合,または関数原型が省略記号で終わっている場合,未定義とします。

(16)

アドレス,および間接演算子

正しくない値がポインタに代入されている場合の,単項*演算子の動作は,ハードウエア設計,および正しくない値の内容により,メッセージを出力するか,不定な値を取るか,不正なアクセスとなります。

(17)

キャスト演算子−関数ポインタのキャスト

型変換されたポインタが元の型以外の関数を呼び出すために使われた場合,未定義とします。

(18)

キャスト演算子−汎整数型のキャスト

ポインタを汎整数型にキャストした場合で,領域の大きさが不十分な場合は,未定義とします。

(19)

乗除演算子

コンパイル中に0による除算剰余算を検出した場合,メッセージを出力し,ゼロ除算のコードを生成します。

(20)

加減演算子−配列以外のポインタ

配列オブジェクトの要素を指すかのように動作するもの以外のポインタに対して,加算,または減算を行っている場合,未定義とします。

(21)

加減演算子−別な配列へのポインタ減算

同じ配列オブジェクトの中を指すかのように動作するもの以外の2つのポインタに対し,減算を行っている場合,未定義とします。

(22)

ビット単位のシフト演算子

右オペランドの値が負であるか,または拡張した左オペランドのビット幅以上の場合,未定義とします。

(23)

関係演算子−ポインタ

比較対象のポインタで指されているオブジェクトが同一の集成体オブジェクト,または共用体オブジェクトのメンバでない場合,未定義とします。

(24)

単純代入

オブジェクトに格納されている値が,何らかの形でそのオブジェクトの記憶域に重なるほかのオブジェクトを通してアクセスされる場合,重なりは完全に一致していなければなりません。さらに,2つのオブジェクトの型は,適合する型の修飾版,または非修飾版でなければなりません。一致しない重なりの代入は,代入によって代入元の値が破壊されます。代入後の値は保証しません。

(25)

構造体指定子及び共用体指定子

メンバ宣言並びが名前付のメンバを含まない場合,警告メッセージを出力します。ただし,-strict_stdオプションを指定した場合は,同一メッセージでエラーとします。

(26)

型修飾子−const

const修飾型で定義されたオブジェクトを非const修飾型の左辺値を使って変更しようとした場合,未定義とします。

(27)

型修飾子−volatile

volatile修飾型で定義されたオブジェクトを,非volatile修飾型の左辺値を使って変更しようとした場合,未定義とします。

(28)

return文

式を持たないreturn文を実行し,呼び出し元で関数呼び出しの値を使用している場合,未定義とします。

(29)

関数定義

可変個引数の実引数を受け付ける関数が,省略記号表記で終わる仮引数型並びをもたずに定義された場合,仮引数の値が不定となります。

(30)

条件付取り込み

置き換え処理によって字句definedが生成される場合,またはdefined単項演算子のマクロ置き換え前の使用法が制約の中で規定した2つの形式のどちらにも一致しない場合,未定義とします。

(31)

マクロ置き換え−前処理句を含まない実引数

実引数が(実引数の置換前に)前処理句を含まない場合,未定義とします。

(32)

マクロ置き換え−前処理指令を持つ実引数

実引数の並びの中に,ほかの場合であれば前処理指令として働く前処理字句列がある場合,未定義とします。

(33)

#演算子

置き換えの結果が,正しい単純文字列リテラルでない場合,メッセージを出力します。

(34)

##演算子

置き換えの結果が,正しい前処理字句にならない場合,メッセージを出力します。