使用了条件编译,为什么还是报错?

来源:百度知道 编辑:UC知道 时间:2024/09/20 19:55:24
在下面程序中,已经使用了条件编译,但还是报错了
请帮忙解释一下,编译器为VC++6.0
为了方便阅读,我写了这种问题的最简单情况
//文件Const.h
#ifndef CONST_H
#define CONST_H

long double Pi = 3.1415926;
const char* FILE ="data.txt";

#endif

//文件Func.cpp
#include "Const.h"
void Func()
{
}

//文件main.cpp
#include "Const.h"
void main()
{
}

编译报错:
error LNK2005: "char const * const FILE" (?FILE@@3PBDB) already defined in main.obj
Func.obj : error LNK2005: "long double Pi" (?Pi@@3OA) already defined in main.obj
Debug/New.exe : fatal error LNK1169: one or more multiply defined symbols found

怎么回事啊?
难道条件编译有问题吗?
要是进行了条件编译,整个头文件不就只被读一次吗,怎么还会出现变量重复定义的错误呢?
我想知道的是不是变量定义上有什么问题,而是这个头文件被编译了几次

条件编译限制头文件只被展开一次,那是在一个文件里面如果使用超过两次的#include<..>
你在不同的文件里面,那肯定至少要被展开一次啊

比如
a.h中
#include "c.h"

b.h中
#include "c.h"

main.c中
#include "a.h"
#include "b.h"
这里展开就会有两个#include "c.h"

c.h必须要使用条件编译,例如:
#ifndef _C_H_
#define _C_H_
/* ... */
#endif

-----------------------------------------------
可以这样修改:
-----------------------------------------------
//文件Const.h
#ifndef CONST_H
#define CONST_H
extern long double Pi; //
extern const char* FILE; //
#endif

//文件Const.c
long double Pi = 3.1415926;

const char* FILE ="data.txt";

跟条件编译没关系 建议你改为
#ifndef CONST_H
#define CONST_H

#define Pi 3.1415926;
#define FILE "data.txt";

#endif
或者在变量前加static

头文件里不可以定义变量