バブルソートを書いて、VC などのコンパイラでは問題なかったのに、Keil C51 では大量のエラーが出て困りました。
括弧の閉じ忘れなどの基本的な原因の他に、もう一つありえる原因是:
== 変数名が C51 のキーワードと被っている ==
例えば私が使った data は、C51 の予約キーワードです:
data は C51 の予約キーワード。太字でのハイライトが分かりにくく、見落としやすい
そこに data という名前の配列を定義してしまったため、以下のような大量のエラーが発生しました:
大量的 error C141: syntax error near '[' が表示され、構文エラーと誤認しやすい
解決策
配列の名前を変更するだけで直ります。
こうしてスクリーンショットを貼り付けたのは、百難の Keil のキーワードハイライトの分かりにくさを痛感したからです……最初は全然気づきませんでした。
この2時間を返我还QAQ という思いでこの記事を書きます。
付録:C51 キーワード一覧
メモリタイプ(記憶域型)
変数を宣言する際にメモリタイプは省略可能。C51 はコンパイルモードに応じてデフォルトのメモリタイプを適用する
基本データ型
C51がサポートする基本データ型の一覧
記憶域クラス(ストレージクラス)
C51 変数の記憶域クラスは4種類あります:
- auto(自動)
- extern(外部)
- static(静的)
- register(レジスタ)
特殊機能レジスタ sfr
8051 の特殊機能レジスタ(SFR)のアドレスを宣言するために使用します。
ビット変数 bit
0 または 1 の値のみ取れるビット変数を宣言するために使用します。
他のキーワードはまあまあ大丈夫だけど、この data は本当に他の言語で慣れているだけに厄介ですね……