定义在头文件里的const 变量
头文件只放声明,不放定义
头文件中不可以放置:
extern int val=10;
double fica_rate
多个文件包含这个头文件时会导致多重定义链接错误。编译阶段可能不报错,链接阶段让整个工程连在一起时就会报错
链接阶段解决模块间的相互引用问题,编译阶段生成目标文件而不处理外部引用问题
三种例外(C++中)
- 头文件中可以定义类
- 值在编译时就已知道的const对象
- inline函数
C++认为值在编译时就已知道的const对象是文件内局部变量
而C中认为是extern的量
强弱符号
编译器编译源文件时会把源文件的全局符号(global symbol)分成
强(strong)
弱(weak)
两类传给汇编器,
而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。
那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化的全局变量则成了弱符号。
extern int errorno;
int buf[2] = {1,2};
int *p;
int main()
{
return 0;
}
这里main,buf都是强符号,p是弱符号
errorno是个非强非弱的符号,只是个外部变量的使用声明
链接器如何处理全局符号
规则1: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);
规则2: 如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么选择强符号;
规则3: 如果一个符号在所有目标文件中都是弱符号,那么选择其中任意一个;
解释三种例外中的第二项
值在编译时就已知道的const对象在C中被认为是extern的量,extern量的值不可以对其初始化。
C++中默认认为定义在他的文件的局部变量
编译器在这种情况下不会认为const全局变量被重复定义
//b.h
#ifndef B_H_
#define B_H_
const int c_data = 100; //在头文件中定义全局const变量
void fun_b();
#endif
//---------------------------------------------------------------------------
//b.cpp
#include <iostream>
#include "b.h"
using namespace std;
void fun_b()
{
cout<<"in b.cpp "<<c_data<<" "<<&c_data<<endl;
}
//---------------------------------------------------------------------------
//main.cpp
#include <iostream>
#include "b.h"
using namespace std;
int main ()
{
fun_b();
cout<<"in main.cpp "<<c_data<<" "<<&c_data<<endl;
return 0;
}
运行程序输出:
in b.cpp 100 0x404004
in main.cpp 100 0x404024
通过地址可以看出,事实上b.cpp和main.cpp中的c_data的地址是不一样的
也就是说其实在b.cpp和main.cpp中的c_data并不是同一个全局变量,但是他们的常量值是相同的
不过由于这是个const变量,其值是常量的,不会变化,因此不会造成程序的错误
C++会默认认为其为内部连接,除非将其声明为外部连接
版权声明:本文为weixin_43604927原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。