5

.c ファイルとプライベート .h ファイルがかなり複雑な構造を定義するようにいくつかの C コードを設計しようとしていますが、パブリックに面したヘッダー ファイルはその構造型へのポインターのみを必要とします。私が試したのはこれでした:

publicRadio.h

typedef struct _radio Radio;
void radioReceive(Radio *radio, ....);

privateRadio.h

#include <publicRadio.h>
struct _radio {
    ...
    ...
}

ラジオ.c

#include <publicRadio.h>
#include <privateRadio.h>

void radioReceive(Radio *radio, ....)
{
    ...
}

これをコンパイルしようとすると、次のようなものが得られます

radio.c:91:9: error: parameter 'radio' has just a forward declaration
radio.c:90:6: error: conflicting types for 'radioReceive'
publicRadio.h:29:6: note: previous declaration of 'radioReceive' was here

私は、関数を介して構造を公開する公開 API を持つ他のライブラリで見たパターンをエミュレートしようとしていますが、詳細は隠しています。それを達成するために使用するレシピは何ですか?

4

2 に答える 2

4

このパターンは通常、次のように実装されます。

ラジオ.h

#ifndef RADIO_H
#define RADIO_H

typedef struct _radio Radio;
void radioReceive(Radio *radio, ....);

#endif

ラジオ.c

#include "radio.h"

struct _radio {
    // _radio struct implementation
};

void radioReceive(Radio *radio, ....) {
    // radioReceive implementation
}

main.c

#include "radio.h"
.... // use Radio, radioReceive, etc.
于 2012-12-18T19:40:56.160 に答える
2

OK: 以下、MSVC と GCC の両方で問題なく動作します。

2 つの重要なエラーは次のとおりです。

  • privateRadio.h にセミコロンがありません
  • publicRadio.h を radio.c に含めると、二重に含まれます。privateRadio.h に既に含まれています

使用したコードは次のとおりです。

publicRadio.h

    typedef struct _radio Radio;
    void radioReceive(Radio *radio, ....);

privateRadio.h

    #include "publicRadio.h"

    struct _radio {
        ...
        ...
    };

ラジオ.c

    #include "privateRadio.h"

    void radioReceive(Radio *radio, ....)
    {
        ...
    }

main.c

    #include "publicRadio.h"

    void main()
    {
        Radio* radio = ...;
        radioReceive(radio, ....);
    }
于 2012-12-18T19:53:17.437 に答える