头文件被包含两次

时间:2013-01-15 17:51:30

标签: c visual-studio compiler-errors header-files

我对C比较陌生(因为我不想使用C ++,或者至少还没有),我不知道如何解决我遇到的包含错误。

我有一个包含常量值1000的头文件,名为Test。

const int Test = 1000;

我把这个文件包含在2个文件中 - Myfile.c和Myfile2.c,每个文件都包含这样的文件:

#include "MyHeader.h"

我的项目不会构建/编译,因为我发现它包括两次的标题是不允许的,因为我声明我的变量“Test”两次。经过研究,我在维基百科上发现了这一点:http://bit.ly/10wPraP

我使用了这个“Include Guard”

示例:

#ifndef MY_HEADER
#define MY_HEADER
 const int Test = 1000;
#endif

我也曾尝试过预处理器(?)命令pragma。

#pragma once

但是,我的程序仍然无法构建。我现在得到错误,说已经在MyFile.obj中定义了变量“Test”。

我认为这可能是Visual Studio-ism,因为我正在使用它,但我的2010 Express C ++和VS2003 Professional都不会构建它。我试过在Visual Studio中清理项目,我不知道还能做什么。

我是非常愚蠢而且在这里遗漏了一些明显的东西,这就是为什么它不起作用?

我习惯于使用C#和“使用”命名空间而不是包含。我可以在VS上设置只编译C代码吗?

4 个答案:

答案 0 :(得分:8)

包括警卫与它无关。您需要将声明与定义分开,并且只有一个定义(这称为“一个定义规则”,ODR):

<强> header.h:

extern const int n;

一个源文件:

#include "header.h"

const int n = 1000;

所有其他源文件:

#include "header.h"

答案 1 :(得分:3)

有用的参考资料:

问题在于#include它们时处理头文件的方式:头文件被字面复制并粘贴到C文件的主体中。这意味着Myfile.c和Myfile2.c都有自己的名为Test的int声明 - 实际上是创建了一个变量的两个不同版本。然后链接器抱怨有两个不同的变量具有相同的名称。

解决方案是将const int Test = 1000;放入您的一个C文件中,并将extern const int Test;添加到MyHeader.h中。这样,变量只声明一次,并且所有文件都知道一个变量,因为extern指令告诉他们另一个文件有他们正在寻找的变量Test

<强> MyHeader.h

extern const int Test;

Myfile.c (例如)

#include "MyHeader.h"
...
const int Test = 1000;

<强> Myfile2.c

#include "MyHeader.h"
...
<use Test>

答案 2 :(得分:0)

这是对的。您有两个定义 Test的源文件。你应该只定义一次。由于头文件遍布整个地方,因此通常只应声明变量,而不是定义它们。 e.g。

头:

const int Test;

正好一个c档:

const int Test = 1000;

答案 3 :(得分:0)

在任何一个.c文件中定义该变量,并在头文件中将其声明为extern。

#ifndef MY_HEADER
#define MY_HEADER
 extern const int Test;
#endif

Myfile.c中定义变量

const int Test = 1000;