keichanぶろぐ

目次

Blog 利用状況

ニュース

FF XI

Profile

初音ミク

iKnow!

記事カテゴリ

書庫

日記カテゴリ

2007年10月10日 #

プログラミング言語C コンパイルエラーの答えあわせ

ちなみにネタ元はこちら

引用は JISX 3010:2003 を用いています。

6.4 字句要素
構文規則
 字句:
   キーワード
   識別子
   定数
   文字列リテラル
   区切り子
 前処理字句:
   ヘッダ名
   識別子
   前処理数
   文字定数
   文字列リテラル
   区切り子
   上野分類のいずれにも当てはまらない非空白類文字

6.4.8 前処理数
構文規則
 前処理数:
   数字
   . 数字
   前処理数 数字
   前処理数 識別子用非数字
   前処理数 e符号
   前処理数 E符号
   前処理数 p符号
   前処理数 P符号
   前処理数 .

補足説明 前処理数は,省略可能な先行するピリオド(.)をもつ数字で始まる。その後ろに正しい識別
子用文字及び文字の並びe+,e-,E+,E-,p+,p-,P+又はP-が続いてもよい。

意味規則 前処理数は,型も値ももたない。型と値は,[翻訳フェーズ(7)で] 浮動小数点定数字句又は
整数定数字句に変換された結果として決まる。


では、翻訳フェーズとはなんぞや?と調べてみると


5.1.1.2 翻訳フェーズ 次に示すフェーズによって,翻訳上の構文規則間の優先順位を規定する
(1) 必要ならば,物理的なソースファイルの多バイト文字を,対応するソース文字集合に,処理系定義
  の方法で,写像する(この際,行の終わりを示すものに対して改行文字を導入する。)。3 文字表記
  を,対応する単一の文字の内部表現に置き換える。
(2) 逆斜線文字(\)の直後に改行文字が現れた場合,それらの2文字を削除する。これによって物理ソ
  ース行を接合して論理ソース行を作成する。一つの物理ソース行においてこの接合の対象となるの
  は,その行の最後の逆斜線文字だけとする。空でないソースファイルは,改行文字で終了しなけれ
  ばならない。さらに,この改行文字の直前に(接合を行う前の時点で)逆斜線文字があってはなら
  ない。
(3) ソースファイルを,前処理字句及び空白類文字(注釈を含む。)の並びに分割する。ソースファイ
  ルは,前処理字句の途中又は注釈の途中で終了してはならない。各注釈を,一つの空白文字に置き
  換える。改行文字を保持する。改行文字を除く空白類文字の並びを保持するか一つの空白文字に置
  き換えるかは,処理系定義とする。
(4) 前処理指令を実行し,マクロ呼出しを展開する。さらに,_Pragma 単項演算子式を実行する。字句
  連結(6.10.3.3参照)の結果として生成される文字の並びが国際文字名の構文規則に一致する場合,
  その動作は未定義とする。#include 前処理指令に指定された名前を持つヘッダ又はソースファイ
  ルに対して,フェーズ(1)からフェーズ(4)までの処理を再帰的に行い,すべての前処理指令を
  削除する。
(5) 文字定数及び文字列リテラル中のソース文字集合の各要素及び各逆斜線表記を,それぞれに対応す
  る実行文字集合の要素に変換する。対応する要素が存在しない場合,ナル(ワイド)文字以外の処
  理系定義の要素に変換する。
(6) 隣接する文字列リテラル字句同士を連結する
(7) 字句を分離している空白類文字は,もはや意味を持たない。各前処理字句を字句に変換する。その
  結果,生成された字句の列を構文的及び意味的に解析し,翻訳単位として翻訳する。
(8) すべての外部オブジェクト参照及び外部関数参照を解決する。その翻訳単位中に定義されていない
  関数及びオブジェクトへの外部参照を解決するため,ライブラリの構成要素を連係する。これらす
  べての翻訳出力をまとめて,実行環境上での実行に必要な情報を含む一つのプログラムイメージを
  作る。


つまり、前処理字句を字句に変換する時に 0xfefe+1 を「整数定数字句(0xfefe) + 整数定数字句(1)」と変換せずに
「浮動小数点字句(0xfefe+1)」と変換してしまい、浮動小数点字句(0xfefe+1)をコンパイラが理解できずエラーが

発生する。という流れになっています。


このエラーを出さないようにするには'+'の前に空白類文字を追加すれば解決します。


ということで、iさん、かつのりさん正解です。おめでとうございます。

#ちなみにVSコンパイラでエラーにならないのは、ユーザーがこんなことでドはまりしないように
#との対処かな。と邪推してみる

posted @ 16:58 | Feedback (25)