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記法の名残だと思う。

かなり古いCなので、現代のCとは勝手が違う。
使える型もかなり制限があり、char/short/int/unsignedの4つだけだ。(shortとintはどちらも符号付き2バイト整数なので、事実上3つの型しかない)
charは符号なし1バイト整数で、この頃のCは数値をchar型変数に格納することは考慮されておらず、1文字を格納するために使う。
intとshortは符号あり2バイト整数だ。
unsignedは符号なし2バイト整数でこれ自体が一つの型であり、unsigned int とか unsigned char というように他の型名と組み合わせて使うことはできない。
void型すら無いので、何も返さない関数でもchar/short/int/unsignedのどれかの型として定義する必要がある。
といっても値を返す必要がなければreturnは書かなくても良い。
最後に評価された値が自動的に関数の戻り値となるので、これを利用すると関数内にreturnを書かなくても値を返すことができる。(当時はこれを使って値を返し、returnを書かない人が結構いた。余談だがCの関数は終了後に必ず何かのデータが返るようになっていて、たとえvoid型であっても sizeof(void) 分のバイト数がレジスタなりスタックなりに格納されて呼び出し元に返り、すぐに捨てられる)

定義時の関数名は大文字・小文字を区別してくれない上に、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