在多个源文件中声明变量

时间:2013-08-01 10:19:23

标签: c

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

我还有另外两个* .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每次都被定义为service.h中的全局,因此每次都包含在* .c文件中。

我只想问一下,在多个* .c源文件中使用service_state_msg的最佳方式是什么?

非常感谢任何建议,

2 个答案:

答案 0 :(得分: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数组的副本,如果更改,则都需要重新编译。

答案 1 :(得分:1)

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

extern char ** service_state_msg; // in the header file