この項では,ANSI規格における未定義の項目について説明します。
ソース・ファイルに文字集合として定義された文字以外がある場合,メッセージを出力します。
文字“ ' ”,または文字“ " ”がその最後の分類(区切り子,および字句的に他の前処理字句の種類に一致しない単一の非空白類文字)に入る場合,メッセージを出力します。
識別子全文字を意味がある文字とするため,意味のない文字は存在しません。
翻訳単位の中で同じ識別子が内部結合と外部結合の両方で現れた場合,メッセージを出力します。
同じオブジェクト,または関数を参照するすべての宣言は,適合しなければなりません。それ以外の場合,メッセージを出力します。
特定の非図形文字は,\に続く英小文字から構成する拡張表記\a,\b,\f,\n,\r,\t,および\vによって表現できます。その他の拡張表記はもたず,\に続く文字は,その文字自身とします。
単純文字列リテラルとワイド文字列リテラル字句が隣り合うとき,結合してワイド文字列リテラルとします。
文字,',",//,または/*が,区切り記号<と>の間の文字列中,または二つの区切り記号”の文字列中に現れた場合は,そのままファイル名として扱います。\文字はフォルダ区切りとして扱います。
浮動小数点型の値を整数型に型変換する場合,整数部の値が整数型で表現できなければ,未定義とします。
関数原型を含まない形で関数を定義し,かつ拡張後の実引数の型が,拡張後の仮引数の型と一致しない場合,仮引数は不定値となります。
呼び出される関数を表す式によって指される型と適合しない型で関数が定義されている場合,関数の戻り値は不正な値となります。
関数原型を含む型で関数を定義し,かつ拡張後の実引数の型が仮引数の型と適合しない場合,または関数原型が省略記号で終わっている場合,仮引数の型として解釈されます。
正しくない値がポインタに代入されている場合の,単項*演算子の動作は,ハードウエア設計,および正しくない値の内容により,不定な値を取るか,不正なアクセスとなります。
型変換されたポインタが元の型以外の関数を呼び出すために使われた場合,未定義とします。
ポインタを整数型にキャストした場合で,領域の大きさが不十分な場合は,未定義とします。
コンパイル中に0による除算剰余算を検出した場合,メッセージを出力します。
配列オブジェクトの要素を指すかのように動作するもの以外のポインタに対して,加算,または減算を行っている場合,未定義とします。
同じ配列オブジェクトの中を指すかのように動作するもの以外の2つのポインタに対し,減算を行っている場合,未定義とします。
右オペランドの値が負であるか,または拡張した左オペランドのビット幅以上の場合,未定義とします。
比較対象のポインタで指されているオブジェクトが同一の集成体オブジェクト,または共用体オブジェクトのメンバでない場合,未定義とします。
オブジェクトに格納されている値が,何らかの形でそのオブジェクトの記憶域に重なる他のオブジェクトを通してアクセスされる場合,重なりは完全に一致していなければなりません。さらに,二つのオブジェクトの型は,適合する型の修飾版,または非修飾版でなければなりません。一致しない重なりの代入は,代入によって代入元の値が破壊されます。
メンバ宣言並びが名前付のメンバを含まない場合,意味を持たない旨の警告メッセージを出力します。ただし,-Xansiオプションを指定した場合は,同一メッセージでエラーとします。
const修飾型で定義されたオブジェクトを非const修飾型の左辺値を使って変更しようとした場合,未定義とします。
volatile修飾型で定義されたオブジェクトを,非volatile修飾型の左辺値を使って変更しようとした場合,未定義とします。
式を持たないreturn文を実行し,呼び出し元で関数呼び出しの値を使用している場合で,宣言がある場合はメッセージを出力します。宣言がない場合は,関数の戻り値が不定値となります。
可変個引数の実引数を受け付ける関数が,省略記号表記で終わる仮引数型並びをもたずに定義された場合,仮引数の値が不定となります。
置き換え処理によって字句definedが生成される場合,またはdefined単項演算子のマクロ置き換え前の使用法が制約の中で規定した二つの形式のどちらにも一致しない場合,通常のdefinedとして扱います。
実引数が(実引数の置換前に)前処理句を含まない場合,メッセージを出力します。
実引数の並びの中に,ほかの場合であれば前処理指令として働く前処理字句列がある場合,メッセージを出力します。