W.I.S. Laboratory
menu-bar

MSX


MSX-Cについて

MSX-Cが発売されたのは1985年、まだC89(ANSI-C)が存在しなかった時代だ。
K&R Cがベースになっている感じがする。
なので今の感覚で書くとコンパイルできないことが多く、特に引数のある関数をK&R記法で書かなくてはならないので、この点に注意しなくてはならない。

K&R記法での関数定義は、

と、こんな感じで書く。
仮引数の名前と順序を括弧の中に書き、関数ブロックが始まる前に引数の型宣言をする。
ちなみに現代のCコンパイラ(C20)でも、この書き方でエラー無くコンパイルできる。(C23から禁止されるらしい?)
昔からCを書いている人には、関数定義の際にシグネチャを書いたら一旦改行し、そこからブロックを開始する人が多くいるが、これはK&R記法の名残だと思う。

使える型もかなり制限があり、char/short/int/unsignedの4つだけだ。(shortとintはどちらも2バイトなので、事実上3つの型しかない)
unsigned型は符号なし2バイト整数となり、現代のように unsigned int とか unsigned char というように他の型名と組み合わせて宣言することはできない。
void型すら無いので、何も返さない関数でもchar/short/int/unsignedのどれかの型として定義する必要がある。
といっても最後に評価された値が返ってすぐに捨てられるだけなので、returnは明示しなくても良い。(Cの関数は終了後に必ず何かのデータが返るようになっていて、たとえvoid型であっても最低1バイトがスタックに積まれて呼び出し元に返る)

定義時の関数名は大文字・小文字を区別してくれない上に、6文字までしか認識しないので結構苦しい。(funcname1 も funcname2 も FUNCNAME3 も FuncName4 もすべて最初に定義した関数になってしまう)
といっても関数呼び出し時は関数名を区別するので、FUNC という名前で定義した関数を func() として呼び出せるということではないし、functionname1 という名前で定義した関数を functi() で呼び出せるということではない。(これはエラーになる)
funcname1 という関数を定義した後に funcname2 と FUNCNAME3 という関数を定義すると、これらの区別をしてくれない。
このとき funcname1() を呼んでも funcname2() を呼んでも FUNCNAME3() を呼んでも、funcname1 に書いた内容が実行される。
しかし funcnameA() とか FuncName1() とかやると、「そんな関数は無い」と言ってくる。
なんとも釈然としない制限だ。

他にも、mallocしたポインタをちゃんとキャストしないといけなかったり、sizeof('A') が 1 だったりと、C++のような挙動をするところもある。(今のCだとポインタは暗黙キャストしてくれるし、sizeof('A')はintと同じサイズになる)

使えないのは

  • 関数型マクロ
  • 列挙型 (enum)
  • void型
  • long型
  • float型
  • double型
といったところだ。
関数型マクロを書いても単純に展開されるだけなので関数として機能してくれず、大抵はundefineになってしまう。
enumはまったく使えない。(Syntax Errorになる)

型のサイズなどについて

MSX-Cの型のサイズは以下のようになっている。
  • char : 8bit (0~255)
  • short : 16bit
  • int : 16bit
  • signed(符号無しint) : 16bit
  • long : 無し
  • long long: 無し
  • float: 無し
  • double: 無し
char型の範囲は0~255となっている。
この時代のCはsigned charが使えないので、数値をcharに格納することは推奨されない。


[ 戻る ]
saluteweb