3

我对 C 比较陌生(因为我不想使用 C++,或者至少现在还不想),而且我不确定如何解决我遇到的包含错误。

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

const int Test = 1000;

我将此文件包含在 2 个文件中 - Myfile.c 和 Myfile2.c 每个都包含以下文件:

#include "MyHeader.h"

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

我用了这个“包括守卫”

例子:

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

而且我还尝试过一次预处理器(?)命令编译指示。

#pragma once

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

我认为这可能是我正在使用的 Visual Studio 主义,但我的 2010 Express C++ 和 VS2003 Professional 都不会构建它。我已经尝试在 Visual Studio 中清理项目,但我不确定还能做什么。

我是不是很傻,在这里遗漏了一些明显的东西,这就是为什么它不起作用?

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

4

4 回答 4

8

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

标头.h:

extern const int n;

一个源文件:

#include "header.h"

const int n = 1000;

所有其他源文件:

#include "header.h"
于 2013-01-15T17:57:21.403 回答
3

有用的参考:

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

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

我的头文件.h

extern const int Test;

Myfile.c(例如)

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

我的文件2.c

#include "MyHeader.h"
...
<use Test>
于 2013-01-15T17:55:53.637 回答
0

这是对的。您有两个定义 Test. 您应该只定义一次。由于头文件被包含在所有地方,它们通常应该只声明变量,而不是定义它们。例如

标题:

const int Test;

正好一个c文件:

const int Test = 1000;

于 2013-01-15T17:58:06.750 回答
0

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

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

Myfile.c定义变量

const int Test = 1000;
于 2013-01-15T17:58:54.370 回答