• ベストアンサー

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

  • ヘッダファイルにおける文字列リソース定義

    C言語(主にVC++)で開発をしていると、よく、 const char MSG_HELLO[] = "HELLO!"; のように、ヘッダファイル中で、文字列リテラルを定義します。 自分もいつのまにかこのようにリソース定義するようになっていましたが、初期の頃から疑問だったのは、extern宣言せずにchar配列を宣言しているから、コンパイラが最適化しなかったら、上記宣言のあるヘッダファイルを読み込んで、その定義を使った個所のあるソース分文字列リテラルがメモリ上に確保されてしまうのではないか、、?ということです。 つまり、本来なら const char* MSG_HELLO[] = "HELLO!"; とソースファイル中で定義し、ヘッダファイルには extern const char* MSG_HELLO; とすべきではないか、と思うわけです。ただ実際にこれをやっているとヘッダとソースの両方のメンテナンスが必要になるので、冒頭のように記述しているのだと思いますが。 この、本来なら下記のようにすべきだが、コンパイラの最適化(リソースのプール)を期待して最初のように書いている、という解釈は正しいでしょうか?

  • ポインタによる文字列の出力

    こんにちは、お世話になっています。 この参考書のプログラムの例題のソースを実行しようとしたのですが、 Visual Studioを使っているのですが、警告がなぜか出てしまいます。 プログラム力もそんなにないので何が原因か解りません。 ご教示お願いします。 #include<iostream> using namespace std; int main() { char* str = "Hello"; ←ここでエラー cout << str << '\n'; return 0; } 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0144 型 "const char *" の値を使用して型 "char *" のエンティティを初期化することはできません

  • 関数について

    char *str_char(const char *str, int c) { while (*str++) if (*str == c) return ((char *)str); return (NULL); } /*文字列strから文字cを検索し最初に存在する文字へのポインターを返す*/ 上記関数なのですが 5行目を return (str); にしてはなぜいけないのでしょうか。

  • ポインタ配列

    ポインタ配列によるひとつのプログラムを組もうと思っています。 で、以下のようなプログラムを作ってみました。 1:#include<stdio.h> 2:#define NUM 5 3:main(void){ 4: char *str[NUM]; 5: int i; 6: for(i=0;i<NUM;i++){ 7: printf("string --->"); 8: scanf("%s",str[i]); 9: } 10: for(i=0;i<NUM;i++){ 11: printf("str[%d] --> %c\n",i,str[i]); 12: } 13:} これなのですが、8行目のscanf文でコンパイルエラーではなく、実行エラーが出ます。どのようにすれば動くようになるのでしょうか? 入力する文字は、9文字以下を想定しています。

  • 文法エラーが解決出来ません・・

    phpでパースエラーが出るのですが、ドコが間違っているのかが解りません。 ============エラー文========================================= Parse error: syntax error, unexpected T_CHARACTER, expecting T_STRING or T_VARIABLE or T_NUM_STRING on line 296 ============================================================= ============エラーのソース(左の数字が行番号)================= 295|$str = " 296|//<form method=\"post\" action=\"$SERVER[\"PHP_SELF\"]\" enctype=\"multipart/form-data\" > ・ ・ 472|</html>"; 473|$str = mb_convert_encoding($str, "SJIS", "EUC-JP"); 474|echo $str; ============================================================= 295行目の$strに296行目から472行目までのHTML記述を代入して最後の行で出力しようとしているものです。 ちなみに、296行目のエスケープ(//)は、エスケープしてもしなくても296行目にエラーが出ます。 どなたか心当たりありましたらご意見宜しくお願いします!

    • ベストアンサー
    • PHP
  • typeidと計算コスト

    今、以下のようなクラスの関数を作っているのですが、typeidはプログラム実行時に実行される関数という扱いなのでしょうか? それとも、コンパイル時に実行されるマクロ関数的な扱いのものなのでしょうか? もし、プログラム実行時に実行されるなら、コンパイル時にTTの種類によって内容をコンパイルする内容を変更すると言うことは不可能でしょうか? また、どうしても、プログラム実行時にしかできないのならと考え、 type_info ty=typeid(TT) と、代入してから判定してみようかとやってみたのですが、「error C2248: 'type_info::type_info' : private メンバ (クラス 'type_info' で宣言されている) にアクセスできません。」と表示され無理なようでした。 何か良い方法はないものでしょうか? template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   int GetMemberList(char *str,const int bufsize,char *format=0); }; template<class TT> int vector3<TT>::GetMemberList(char *str,const int bufsize,char *format=0){   int i,j;   if(!format){     const int size=4;     type_info     format=new char[size];     if(typeid(TT)==typeid(int)){       strcpy_s(format,size,"%d");     }     else if(typeid(TT)==typeid(double)){       strcpy_s(format,size,"%lf");     }     else{       return(1);     }   }   j=sprintf_s(str,bufsize,format,x[0]);   for(i=1;i<NUM;i++){     j+=sprintf_s(str+j,bufsize-j,",");     j+=sprintf_s(str+j,bufsize-j,format,x[i]);   }   if(format)delete [] format;   return(0); }

  • Javaについて

    Javaについての質問です。 下記のプログラムは Abst_Class show1 can be inheritted to a subclass num1=1 Class1 show2 is created in Class1 num1=1 num2=2 Class2 show1 is inheritted and overridden in Class2 num1=10 str=SSSSSS Class2 show2 is created in Class2 num1=10 str=SSSSSS と出力するプログラムなのですがエラーが出て出力できません。どこがいけないのか教えていただけないでしょうか? お願いいたします。 interface itr{ itr(){} void show(); void dai(); } abstract abr implements itr{ abr(){ int num1; num1=1; } public void dai(){ if(num1==0){ num1=1; } } public void show(){ dai(); System.out.println("Abst_Class show1 can be inheritted to a subclass num1="+num1); } abstract show1(); } class Class1 extends abr{ int num2; Class1(int a,int b){ num1=a; num2=b; } public void show1(){ super.show(); } void show2(){ super.show(); System.out.println("Class1 show2 is created in Class1 num1="+num1+"num2="+num2); } } class Class2 extends abr{ String str; Class2(int num,String str){ this.str=str; num1=num; } public void show1(){ System.out.println("Class2 show1 is inheritted and overridden in Class2 num1="+num1+"str="+str); } void show2(){ System.out.println("Class2 show1 is inheritted and overridden in Class2 num1="+num+"str="+str); } } class K10_6{ public static void main(String args[]){ Class1 f1 = new Class1(1, 2); Class2 f2 = new Class2(10,"SSSSSS"); f1.show1(); f1.show2(); f2.show1(); f2.show2(); } } .\abr.java:1: class、interface、または enum がありません。 abstract abr implements itr{ ^ .\abr.java:4: class、interface、または enum がありません。 num1=1; ^ .\abr.java:5: class、interface、または enum がありません。 } ^ .\abr.java:6: class、interface、または enum がありません。 public void dai(){ ^ .\abr.java:9: class、interface、または enum がありません。 } ^ .\abr.java:11: class、interface、または enum がありません。 public void show(){ ^ .\abr.java:13: class、interface、または enum がありません。 System.out.println("Abst_Class show1 can be inheritted to a subclass num1="+num1 ); ^ .\abr.java:14: class、interface、または enum がありません。 } ^ .\abr.java:15: class、interface、または enum がありません。 abstract show1(); ^ .\abr.java:16: class、interface、または enum がありません。 }

    • ベストアンサー
    • Java
  • const unsigned char *Ptn

    度々お世話になってます。VC++2010、MFC、ユニコードを使う設定で、ワイルドカードを用いたLike処理が使いたいです。 正規表現までは、望んでいません。 それで、過去ログを見てみましたが、まだ分かりませんでした。 ◆ワイルドカードを用いた文字列検索 http://okwave.jp/qa/q287644.html を使いたいです。 一応、リンク先のソースコードを載せておきます。 _________________________________________________________________________________________________ int StrMatchMBS( const unsigned char *Ptn, const unsigned char *Str ) {   switch( *Ptn )   {     case '\0':       return (_mbsnextc(Str)=='\0');     case '*':       return StrMatchMBS( _mbsinc(Ptn), Str ) || (_mbsnextc(Str)!='\0') && StrMatchMBS( Ptn, _mbsinc(Str) );     case '?': return (_mbsnextc(Str)!='\0') && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );     default:       return (_mbsnextc(Ptn)==_mbsnextc(Str)) && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );   } } _________________________________________________________________________________________________ int KeywordDlg::StrMatchMBS( const unsigned TCHAR *Ptn, const unsigned TCHAR *Str ){ としたところ、 エラー 4 error C2050: switch 式の結果は、整数値になりませんでした。 エラー 3 error C2065: 'Ptn' : 定義されていない識別子です。 ・・・のエラーがでます。 _________________________________________________________________________________________________ int KeywordDlg::StrMatchMBS( const TCHAR *Ptn, const TCHAR *Str ){ としたところ Ptn と Str の所で、赤い波線となり、 エラー 2 error C2664: '_mbsinc' : 1 番目の引数を 'const TCHAR *' から 'const unsigned char *' に変換できません。(新しい機能 ; ヘルプを参照) _________________________________________________________________________________________________ ↓この方の質問のままなのですが、具体的に どう書けばいいのか?分かりません。 ◆UNICODE化のための書き換え http://okwave.jp/qa/q6966243.html _tcsrchr もどこで使えばいいのか分かりません。 ポインターの記述を完全に理解していないせいで、分からないのでしょうか? すみませんが、もう少し、補足して頂くとうれしいですm(_ _)m

  • 【初歩】 極単純なFOR文がなぜ「parse error」になるのかわかりません…

    下記のサンプルが,どう見直しても Parse error: parse error, unexpected T_VARIABLE in C:\hoge.php on line 2(2行目とは$str1 = "1";のこと). となってしまうのですが,なぜでしょうか. 下記は質問向けにアレンジしたものですが 本番環境の方では少しメッセージが異なり: Parse error: parse error, unexpected T_FOR in C:\hoge.php on line xxx. と,まあいずれでもエラーになってしまうのですけど・・・ <? php $str1 = "1"; $str2 = "2"; $str3 = "3"; for ($Num = 1; $Num <= 3; $Num++) { echo ${"str" . $Num}; } ?>

    • ベストアンサー
    • PHP
  • ポインタについて

    下記<コード1>ではエラーが出ないのに、 <コード2>のように変更すると、 ”error C2105: '++' には左辺値が必要です。” とエラーが出ます。 どうしてなのか教えて下さい。 <コード1> char *str_copy(char *d , const char *s){ char *t=s2; while(*d++=*s++) ; return (t); } int main(void) { char s1[128]="ABCD"; char s2[128]="EFGH"; str_copy(s2,s1); <コード2> int main(void) { char s1[128]="ABCD"; char s2[128]="EFGH"; // str_copy(s2,s1); while(*s2++=*s1++) ;