为什么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
时才进行多次初始化?
我做错了什么,为了让这个工作有效,我需要做些什么改变?
问候
答案 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