关于头文件用于声明而不是用于定义的疑问
我有一个疑问,在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编译器去编译的吧?
[解决办法]
呃~头文件不是被源文件包含么
[解决办法]
我想说的是,double fica_rate;在.c文件中用C编译器编译时并不一定解析为定义