C - MSVS 2013“C2374:'名称':重新定义,多次初始化” - 为什么?

时间:2013-10-08 12:23:52

标签: c visual-studio initialization redefinition

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

的config.h

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

的main.c

#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时才进行多次初始化?

我做错了什么,为了让这个工作有效,我需要做些什么改变?

问候

3 个答案:

答案 0 :(得分:3)

不要将定义放在头文件中,然后您将在包含头文件的所有翻译单元中使用这些定义。

而是在头文件中只有声明

extern char *names[][2];

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

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

答案 1 :(得分:0)

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

通常会被包括

忽略
#ifndef __CONFIG_H__ 
#define __CONFIG_H__
#endif

但通常你永远不会在头文件中定义任何内容,只需要去除内容

答案 2 :(得分:0)

Yes I'm including this file in another sourcefile. I'll try putting it in the code file though.

这就是你在拥有Header守卫时所犯的错误。你包括很多次。

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

声明