1

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 2013names[][2]は、配列が で 1 回だけ宣言および初期化されるのに、複数の初期化であると通知するのはなぜconfig.hですか?

私は何を間違っていますか?これを機能させるには何を変更する必要がありますか?

ご挨拶

4

3 に答える 3

3

ヘッダー ファイルに定義を入れないでください。ヘッダー ファイルを含むすべての翻訳単位にそれらの定義が含まれます。

代わりに、ヘッダー ファイルで宣言のみを行います。

extern char *names[][2];

そして、その定義を 1 つのソース ファイルに入れます。

また、1 つのソース ファイルに 2 回インクルードされるのを防ぐために、ヘッダー ファイルにインクルード ガードが必要な場合もあります。

于 2013-10-08T12:32:25.463 に答える
0

VisualStudio のような IDE では、使用するヘッダー ファイルを #include せずに (gcc では、呼び出しのオプションのパラメーターになる) オプションで追加できるため、ヘッダー ファイルを 2 回含めることができます。

これは通常、含めることによって無視されます

#ifndef __CONFIG_H__ 
#define __CONFIG_H__
#endif

しかし、通常、ヘッダーファイルで何も定義することはなく、デカールを行うだけです

于 2013-10-08T12:36:44.087 に答える