◀ANSI版開発トップへ
  • 3660 Cアウトラインのバグ
    • 3664 Re:Cアウトラインのバグ
      • 3665 Re2:Cアウトラインのバグ
      • 3670 Re2:Cアウトラインのバグ
        • 3681 Re3:Cアウトラインのバグ
  • [3660] Cアウトラインのバグ げんた 2004年07月08日 22:24

    enum/struct等を解析対象にしたときからだと思いますが,型の宣言以外の場所でこれらのキーワードを使うと解析がおかしくなります.
    たとえば,
    struct ABCが定義されているとき,Cでは
    int function( struct ABC xyz ){
    }
    のように型名のstructを省略できませんが,このように書くとここが関数と認識されなくなった上にそのあともずっと変になります.
    CEditDoc.cppのMakeFuncList_Cにある

    else if( nNestLevel_func == 0 && nMode2 == M2_NORMAL )
    {
    nItemFuncId = 0;
    if( strcmp(szWord,"class")==0 )
    nItemFuncId = 3;
    if( strcmp(szWord,"struct")==0 )
    nItemFuncId = 4;
    else if( strcmp(szWord,"namespace")==0 )
    nItemFuncId = 7;
    else if( strcmp(szWord,"enum")==0 )
    nItemFuncId = 5;
    else if( strcmp(szWord,"union")==0 )
    nItemFuncId = 6;
    if( nItemFuncId != 0 )
    {
    nMode2 = M2_NAMESPACE_SAVE;
    nItemLine = nLineCount + 1;
    strcpy(szItemName,"無名");
    }
    }
    という部分をコメントアウトすれば,型の解析はできなくなりますが上記の問題は起こらなくなります.
    • [3664] Re:Cアウトラインのバグ (全略) 2004年07月09日 21:54

      ▼ げんたさん
      > という部分をコメントアウトすれば,型の解析はできなくなりますが上記の問題は起こらなくなります.
      型の一覧とかはけっこうお世話になってるのでなくならないで欲しいですね^^;

      とりあえず案出しておきます
      Cの文法で()の中にstructってもって来れましたっけ?
      () の中にstructがある時って言う具合に弾いてはどうでしょう?

      - if( strcmp(szWord,"struct")==0 )
      - nItemFuncId = 4;
      + if( strcmp(szWord,"struct")==0 && nNestLevel_fparam == 0 )
      + nItemFuncId = 4;
      こんな感じで

      ただそれだけだと struct HOGE* fuga(int hoo) は崩れてしまいますけど
      • [3665] Re2:Cアウトラインのバグ げんた 2004年07月10日 04:54

        >> という部分をコメントアウトすれば,型の解析はできなくなりますが上記の問題は起こらなくなります.
        >型の一覧とかはけっこうお世話になってるのでなくならないで欲しいですね^^;
        >ただそれだけだと struct HOGE* fuga(int hoo) は崩れてしまいますけど
        うーん,最近私が出会ったCのファイルでは
        enum 型名 func( struct 構造体名1 param1, struct 構造体名2 param2 )
        といった形で定義されているので戻り値にキーワードが来ているパターンも認識してもらえないとちょっと困るんです.

        コメントを見ると__declspec( なんちゃら ) のように括弧を含んだ部分を無視してキーワードを拾えるようにしたとあるのですが,このせいで関数が思いっきり無視されてしまいます.

        struct/enum/class等を予約語と書くことにすると
        > 予約語 型 関数名( 予約語 型 引数名 ){
        と
        > 予約語 型 修飾子( 独自キーワード ) 定義する型名 {
        を区別する必要がありますよね.
        ポイントは)と{の間に文字列があるかどうかです.ここに名前があったら型定義.無ければ関数.ただし"const"の場合は関数.
        さらに関数名や型名は クラス名/ネームスペース名::型名 となることもあるのでそれも考慮しないと...

        ちなみにこの勢いで関数ポインタを含むケースも何とかならないかな.
      • [3670] Re2:Cアウトラインのバグ げんた 2004年07月11日 14:15

        ここ見落としていました.
        >Cの文法で()の中にstructってもって来れましたっけ?
        構造体そのままは入れられなかったかもしれませんが,ポインタで渡すとしても同じことが起きますよね.
        • [3681] Re3:Cアウトラインのバグ (全略) 2004年07月15日 07:40

          ▼ げんたさん
          > struct/enum/class等を予約語と書くことにすると
          > > 予約語 型 関数名( 予約語 型 引数名 ){
          > と
          > > 予約語 型 修飾子( 独自キーワード ) 定義する型名 {
          > を区別する必要がありますよね.
          下の奴、、、独自キーワードってなんでしょう、__declspecの事でしょうか?
          とりあえず、もう一度見直してみます

          > 構造体そのままは入れられなかったかもしれませんが,ポインタで渡すとしても同じことが起きますよね.
          言葉足らずでした
          Cの文法で()の中に構造体宣言ってもってこれないですよね?
          どうせ、宣言以外は必要がないので
          だから()の中のstructは読み飛ばしちゃいませんか、ってのが前に言いたかったことでしたm(_ _)m