• ベストアンサー

ANSIと非ANISIの違いを教えてください

Cの初心者なのですが、makeがうまくいきません。2種類のmakeがあって片方は通ったのですが、もう片方がsyntax errorとなります。調べた結果、初めの方はANSI規格でしたんですが、2つ目はK&Rの規格でした。この事が原因ならば、どうしたらいいでしょうか? void out(enum level num, char *str); extern const char *const level[NUM]; の2行をヘッダーファイルに置いて、使用しています。 すると、この2行が、エラーと出るのですが,どうすればよいでしょうか? すみませんが、教えていただけないでしょうか? 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

> 列挙型タグ名のlevelと変数名のlevelは混じり合わない これはK&Rでも同じのはずです。 多分次のコードで通ると思います。 void out(); extern char *level[NUM];

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

おそらく、名前空間の処理の違いだと思われます。 ANSI規格では、名前空間(識別子などの名前が混じらない範囲)が、 「gotoで使うラベル名」「構造体・共用体・列挙型タグ」 「構造体・共用体のメンバ名」「関数名や変数名などの一般識別子」 の4つに分かれます。 これによると問題のコードで、 列挙型タグ名のlevelと変数名のlevelは混じり合わない (両方を使っても問題ない)はずなのですが、 K&R規格だと名前空間が一緒になり、エラーを起こしてしまったのでしょう。 対処法は…うーん…どっちかの名前を変えるのがいちばん単純なのですが、 それができれば悩んでないかなあ…。 しかし、名前空間が混じっている以上、変数levelを 使用すると、やっぱりコンパイルエラーになってしまうと思います。 どうしても変更できないなら、他のモジュールを中継にして 変数levelを他の変数にコピーし、 動的に(プログラムが動き出した後で)取得するとか。 もっともこれも変なやりかたですが…。 やっぱり、面倒でも、どちらかを書き換えた方がいいのではないでしょうか。

関連するQ&A

専門家に質問してみよう