C言語の言語仕様は一つではありません。 何度も改訂されており、複数の仕様があります。 コンパイラによって対応する仕様が異なるため、 あるコンパイラでは問題のなかったプログラムであっても、 別のコンパイラでは動かないことがあります。
代表的なものに下記があります。
int f(); /* 関数プロトタイプ: 引数チェック不可 */ int f(a, b) /* 関数定義 */ int a, b; {
int f(int a, int b); /* 関数プロトタイプ */ int f(int a, int b) /* 関数定義 */ {
/* C90以前のコメント */ // C99で導入されたコメント
int f() { int a; // 変数の宣言 a = 0; // 最初の実行文 int b; // 変数の宣言: C90以前ではエラーになるC90以前では以下のように書きます。
int f() { int a; // 変数の宣言 int b; // 変数の宣言は最初にまとめて書く a = 0; // 最初の実行文
int f(int n) { int a[n]; // C99で導入された可変長配列: サイズが変数「n」
マイコン用のコンパイラはおおむねANSI C89, ISO C90に基づくと思われます。 C99で拡張されたものの一部、例えば「//」は使用できますが、 変数を宣言する位置に関する制限緩和など、使用できないものも多いようです。 最も注意を要するのは、 変数を宣言する位置です。