4
gcc (GCC) 4.7.2
c89

こんにちは、

私のservice.hファイルには次のものがあります

enum service_state_code {
    NO_ERROR_OK,
    ERROR_INCORRECT_STATE,
    ERROR_EMPTY_STRING,
    ERROR_NO_COMMAND_FOUND
};

const char *service_state_msg[] = {
    "OK:",
    "ERROR: Incorrect state for modifying service channel state",
    "ERROR: No command found",
    "ERROR: No command parameters",
    NULL
};

get_channel_service_state(channel_t *channel, const char *msg);

そして、service.h ファイルを含む 2 つの *.c ファイルがあります。

network.csocket.c

そして、私はそれを次のように使用します:

get_channel_service_state(channel, ss7_service_state_msg[ERROR_INCORRECT_STATE]);

ただし、次のことについて不平を言うリンカ エラーが発生します。

multiple definition of service_state_msg first defined here

このエラーが発生する理由はわかっています。これはservice_state_msg、*.c ファイルに含まれるたびに、service.h でグローバルとして 2 回定義されているためです。

service_state_msg複数の *.c ソース ファイルで使用する最善の方法は何ですか?

ご提案いただきありがとうございます。

4

2 に答える 2

7

service_state_msg externヘッダーファイルで次のようにすることができます:

extern const char *service_state_msg[];

そして、これを動かします:

const char *service_state_msg[] = {
    "OK:",
    "ERROR: Incorrect state for modifying service channel state",
    "ERROR: No command found",
    "ERROR: No command parameters",
    NULL
};

Cファイルのいずれかに。または、ヘッダー ファイルに初期化を残してservice_state_msg静的にすることもできます。

static const char *service_state_msg[] = {
    "OK:",
    "ERROR: Incorrect state for modifying service channel state",
    "ERROR: No command found",
    "ERROR: No command parameters",
    NULL
};

ただし、これは、すべてのオブジェクト ファイルがservice_state_msg配列のコピーを持ち、変更された場合はすべて再コンパイルする必要があることを意味することに注意してください。

于 2013-08-01T10:26:59.123 に答える