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);

我还有 2 个其他 *.c 文件,其中将包含 service.h 文件。

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 中的全局变量。

我只是在问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 回答
1

在 .C 文件中定义和初始化。在头文件中使用以下内容。

extern char ** service_state_msg; // in the header file
于 2013-08-01T10:26:24.533 回答