我对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代码吗?
答案 0 :(得分:8)
包括警卫与它无关。您需要将声明与定义分开,并且只有一个定义(这称为“一个定义规则”,ODR):
<强> header.h:强>
extern const int n;
一个源文件:
#include "header.h"
const int n = 1000;
所有其他源文件:
#include "header.h"
答案 1 :(得分:3)
有用的参考资料:
extern
关键字的维基百科:https://en.wikipedia.org/wiki/External_variable 问题在于#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;