2013-10-08 2 views
1

Почему MSVS отказывается компилировать следующее?C - MSVS 2013 «C2374:« имена »: переопределение, многократная инициализация» - почему?

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 

Почему МСВС 2013 сказать мне его многократную инициализацию, когда массив names[][2] только объявляется и инициализируется один раз в config.h?

Что я делаю неправильно и что мне нужно изменить, чтобы заставить это работать?

Привет

+0

Не помещайте определения в файлы заголовков. Вероятно, вы включили этот файл в другой исходный файл и связали объект с вашей программой. – ouah

+0

Вы пропускаете '#pragma once' в верхней части вашего' config.h'? Лучше поместить это в файл кода, а не в заголовок. –

+0

Да, я включаю этот файл в другой исходный файл. Однако я попытаюсь поместить его в файл кода. – phew

ответ

3

Не помещайте определения в заголовочных файлах, то вы будете иметь эти определения во всех единицах трансляции, которые включают заголовочный файл.

Вместо иметь только декларацию в файле заголовка:

extern char *names[][2]; 

А затем поместить определение в одном исходном файле.

Кроме того, вы можете захотеть иметь include guards в своем файле заголовка, чтобы защитить его от включения дважды в файл с одним исходным кодом.

+0

zwei Leute - ein Gedanke –

+0

Спасибо, я думал, что у одного может быть только файл .h, чтобы он был простым. Работает с разбиением его на источник и заголовок. – phew

0

в среде IDE, такой как VisualStudio, у вас есть необязательное дополнение, чтобы сказать, какие файлы заголовков использовать, без # include'ing them (в gcc, который был бы необязательным параметром для вызова), поэтому может включать заголовок файл дважды.

это, как правило, игнорируется, включая

#ifndef __CONFIG_H__ 
#define __CONFIG_H__ 
#endif 

но обычно вы никогда ничего не определяют в headerfile, просто decalre вещи

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

Это то, что вы делаете ошибку с вне охранниками заголовка. Вы включаете много раз.

Использование Header Guards.
И в ваших исходных файлах объявить с помощью extern