2013-10-08 68 views
1

爲什麼MSVS拒絕編譯以下內容?C-MSVS 2013「C2374:'names':重新定義,多重初始化」 - 爲什麼?

的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

不要將定義放在頭文件中。您可能將該文件包含在另一個源文件中,並將該對象與您的程序鏈接。 – ouah

+0

你在'config.h'的頂部是否缺少'#pragma once'?最好把它放在代碼文件中而不是頭文件中。 –

+0

是的,我將這個文件包含在另一個源文件中。我會嘗試把它放在代碼文件中。 – phew

回答

3

不要把定義在頭文件,那麼你將不得不在所有的翻譯單位包含頭文件的定義。

而是隻有一個在頭文件中的聲明

extern char *names[][2]; 

,然後把定義在一個源文件。

此外,您可能希望在您的頭文件中有include guards,以防止它被包含在單個源文件中兩次。

+0

zwei Leute - ein Gedanke –

+0

謝謝,我以爲可以讓.h文件保持簡單。將它分解爲源代碼和頭文件。 – phew

0

在像VisualStudio這樣的IDE中,您可以選擇添加說明,使用哪個頭文件,沒有#include'ing它們(在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