1

为什么 MSVS 拒绝编译以下内容?

配置文件

char *names[][2] = { 
    { "Marry", "McBlith" }, 
    { "Nadja", "Nurales"}
};   

主程序

#include <Windows.h>
#include <stdio.h>
#include "config.h"

int main()
{
   printf("TEST (names[0][0]): %s\n", names[0][0]);

   return 0;
}

输出:

1>c:\projects\test\config.h(2): error C2374: 'names' : redefinition; multiple initialization
1>c:\projects\test\config.h(2) : see declaration of 'names'

错误列表:

Error 1 error C2374: 'names' : redefinition; multiple initialization c:\projects\test\config.h 2 1 test

为什么当数组只声明和初始化一次时, MSVS 2013告诉我它是多重初始化?names[][2]config.h

我做错了什么,我必须改变什么才能让它工作?

问候

4

3 回答 3

3

不要将定义放在头文件中,那么您将在包含头文件的所有翻译单元中拥有这些定义。

而是在头文件中只有一个声明:

extern char *names[][2];

然后将定义放在一个源文件中。

此外,您可能希望在头文件中包含保护,以防止它在单个源文件中被包含两次。

于 2013-10-08T12:32:25.463 回答
0
Yes I'm including this file in another sourcefile. I'll try putting it in the code file though.

这就是您在没有 Header 防护的情况下所犯的错误。你包括了很多次。

使用Header Guards
并在您的源文件中声明使用extern

于 2013-10-08T12:41:14.443 回答
0

在像 VisualStudio 这样的 IDE 中,您可以选择使用哪些头文件,而无需 #include (在 gcc 中,这将是调用的可选参数),因此可能会包含两次头文件。

这通常被忽略,包括

#ifndef __CONFIG_H__ 
#define __CONFIG_H__
#endif

但通常你从不在头文件中定义任何东西,只是贴上一些东西

于 2013-10-08T12:36:44.087 回答