2017-04-25 188 views
1

私はfile1.hで定義された列挙型を持っています。この列挙型をfile1.hを含まない別のファイルfile2.hの引数として参照したいと思います。今私はfile3.hからget_color()関数を呼び出さなければなりません。 [-Werror] 記憶領域のサイズが不明です:enum

  • エラー1が解決された互換性のないポインタ型から「get_color」の引数1を渡し

    1. 、私は別のエラーを取得::私は2つの異なるエラーの種類を取得していますCOLのISNのストレージサイズを知られていない。

    唯一の問題はfile2.hにfile1.hを含めることができないことです。私がどのように問題を解決できるかを提案してください。

    file1.h

    typedef enum { 
        RED, 
        BLUE, 
        GREEN2, 
    } colors_t; 
    

    file2.h

    void get_color(enum colors_t *col); 
    

    file3.h //オプション1

    #include "file1.h" 
    #include "file2.h" 
    int main() 
    { 
        colors_t col; 
        get_color(&col); //error: passing argument 1 of 'get_color' from incompatible pointer type [-Werror] 
    
    } 
    

    file3.h //オプション2

    #include "file1.h" 
    #include "file2.h" 
    int main() 
    { 
        enum colors_t col; 
        get_color(&col); //error: storage size of col isn't known. 
    
    } 
    
  • +0

    は私が間違っているかもしれないが、typedefではどのように動作するか、それはありません。これは、 'enum colors_t'ではなく' colour_t 'です。構造体に似ています。 – grochmal

    +0

    'file3.c'ではなく、' file3.c'または 'main.c'でなければなりません。ファイル内に関数定義がある場合は、おそらくヘッダーではありません。 – Schwern

    +1

    'enum colors_t'と' colors_t'の両方を使いたいのであれば、 'typedef enum colors_t { RED、 BLUE、 GREEN2、 } colors_t;'と書いてください。それ以外の場合は、1つを選択してください。 –

    答えて

    5

    get_colorsの署名がなければならない...

    void get_color(colors_t *col); 
    

    タイプcolors_tあります。 Not enum colors_t;そのようなタイプはありません。


    私はこの問題がどのように理解できるのかと考えています。typedeftypedefは、型の名前を作成します。

    typedef <type> <alias>; 
    

    単純なタイプの場合、これはかなり簡単です。この別名unsigned charuint8_tです。

    typedef unsigned char uint8_t; 
    

    構造体と列挙型については、混乱するのは簡単です。

    typedef enum { 
        RED, 
        BLUE, 
        GREEN2, 
    } colors_t; 
    

    タイプはenum { RED, BLUE, GREEN2 }です。エイリアス名はcolors_tです。

    この場合、型には他の名前はありません。それはcolors_tによってのみ参照できる匿名のenumです。

    名前を付けることができます。

    typedef enum colors { 
        RED, 
        BLUE, 
        GREEN2, 
    } colors_t; 
    

    次に同じタイプenum colorsまたはcolors_tと呼ぶことができます。

    これは、人々がtypedefによって提供されるカプセル化のベールを穿孔することを可能にするため、これを行うことをお勧めします。つまり、誰もがcolors_tを使用している場合、舞台裏で微妙な方法で変更することができます。

    1

    単純にあなたのコードの変更:

    typedef enum { 
        RED, 
        BLUE, 
        GREEN2, 
    } colors_t; 
    
    void get_color(colors_t *col) 
    { 
        /// get_color body 
    } 
    
    int main(int argc, char **argv) 
    { 
        colors_t col; 
        get_color(&col); 
    
        return 0; 
    } 
    
    関連する問題