读书人

关于头文件用以声明而不是用于定义的疑

发布时间: 2013-03-06 16:20:31 作者: rapoo

关于头文件用于声明而不是用于定义的疑问
我有一个疑问,在c++ primer中一个地方
extern int ival = 0;
double fica_rate;
这里说fica_rate是定义而不是声明,不应该放在头文件,可是我测试了一下,放到头文件,
被几个cpp包含都不会有错误啊,而书上说有两个以上文件包含上述任一个定义都会导致多重定义链接错误

谢谢各位
[解决办法]
一般头文件 都有做 防多重定义的预防措施

如:
#param once

or

#ifndef XXX
#define XXX

....

#endif
[解决办法]
不知楼主是如何测试的,用的什么编译器
$ cat foobar.h foo.cpp bar.cpp


/**
* @file foobar.h
* @brief
*/
#ifndef FOOBAR_H
#define FOOBAR_H

extern int ival = 0;
double fica_rate;

#endif /* FOOBAR_H */


/**
* @file foo.cpp
* @brief
*/

#include <iostream>
using namespace std;

#include "foobar.h"

int main(int argc, char *argv[])
{

return 0;
}


/**
* @file bar.cpp
* @brief
*/

#include <iostream>
using namespace std;

#include "foobar.h"



$ g++ -o foobar foo.cpp bar.cpp
foobar.h:8: 警告:‘ival’ 已初始化,却又被声明为 ‘extern’
foobar.h:8: 警告:‘ival’ 已初始化,却又被声明为 ‘extern’
/tmp/ccsQ5eIj.o:(.bss+0x0): multiple definition of `ival'
/tmp/cculCgD7.o:(.bss+0x0): first defined here
/tmp/ccsQ5eIj.o:(.bss+0x8): multiple definition of `fica_rate'
/tmp/cculCgD7.o:(.bss+0x8): first defined here
collect2: ld 返回 1

[解决办法]
楼主不会是头文件被.c文件包含,然后又用C编译器去编译的吧?
[解决办法]
引用:
楼主不会是头文件被.c文件包含,然后又用C编译器去编译的吧?


呃~头文件不是被源文件包含么
[解决办法]
引用:
引用:
楼主不会是头文件被.c文件包含,然后又用C编译器去编译的吧?

呃~头文件不是被源文件包含么

我想说的是,double fica_rate;在.c文件中用C编译器编译时并不一定解析为定义

读书人网 >C++

热点推荐