定义在头文件里的const 变量

头文件只放声明,不放定义

头文件中不可以放置:

extern int val=10;
double fica_rate

多个文件包含这个头文件时会导致多重定义链接错误。编译阶段可能不报错,链接阶段让整个工程连在一起时就会报错
链接阶段解决模块间的相互引用问题,编译阶段生成目标文件而不处理外部引用问题

三种例外(C++中)

  1. 头文件中可以定义类
  2. 值在编译时就已知道的const对象
  3. 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 
#include "b.h"
using namespace std;
 
void fun_b()
{
	cout<<"in b.cpp "<<c_data<<" "<<&c_data<<endl;
}
 
//---------------------------------------------------------------------------
 
//main.cpp
#include 
#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++会默认认为其为内部连接,除非将其声明为外部连接

你可能感兴趣的:(个人笔记,c++,开发语言)