通过常量表达式初始化的const变量定义在头文件中
2016-11-18 10:44
1051 查看
《C++primer》中,讲到头文件中不可以包含定义,有三个例外:类,常量表达式初始化的const对象,inline。
对于不是用常量表达式初始化的const对象,可以加上extern放在源文件中,并在头文件中加上extern声明。
但是对于用常量表达式(即编译器就可以确定的)初始化的const对象,是不可以这么做,而要将定义全部放在头文件中,原因是该const对象用常量表达式初始化,那么该对象自身也可以作为一个常量表达式为其他对象初始化,而当它作为常量表达式时,其初始化必须为编译器可见,如果将对象的定义放在源文件中,编译阶段还没有链接到它的定义,因此编译器不知道他的具体初始化式,会报错,因此将它的定义直接都放在.h头文件中,这样编译器可以直接找到初始化式,同时由于const的特性,const对象在定义它的文件中是局部变量,因此即使多个文件包含该头文件,也不会重定义报错。
下面是代码验证,enum的特性是它的成员初始化式必须是常量表达式,如果将用常量表达式初始化的const对象放在源文件中,编译器会报错,因为找不到a的具体定义。
a.h
extern const int a;a.cpp
extern const int a = 3;
main.cpp
#include"a.h"
#include<iostream>
using namespace std;
enum Day{
monday = a
};
int main(){
cout <<monday<< endl;
return 0;
}
解决的方法就是将定义全部放在头文件中
a.h
const int a = 3;
main.cpp
#include"a.h"
#include<iostream>
using namespace std;
enum Day{
monday = a
};
int main(){
cout <<monday<< endl;
return 0;
}
对于不是用常量表达式初始化的const对象,可以加上extern放在源文件中,并在头文件中加上extern声明。
但是对于用常量表达式(即编译器就可以确定的)初始化的const对象,是不可以这么做,而要将定义全部放在头文件中,原因是该const对象用常量表达式初始化,那么该对象自身也可以作为一个常量表达式为其他对象初始化,而当它作为常量表达式时,其初始化必须为编译器可见,如果将对象的定义放在源文件中,编译阶段还没有链接到它的定义,因此编译器不知道他的具体初始化式,会报错,因此将它的定义直接都放在.h头文件中,这样编译器可以直接找到初始化式,同时由于const的特性,const对象在定义它的文件中是局部变量,因此即使多个文件包含该头文件,也不会重定义报错。
下面是代码验证,enum的特性是它的成员初始化式必须是常量表达式,如果将用常量表达式初始化的const对象放在源文件中,编译器会报错,因为找不到a的具体定义。
a.h
extern const int a;a.cpp
extern const int a = 3;
main.cpp
#include"a.h"
#include<iostream>
using namespace std;
enum Day{
monday = a
};
int main(){
cout <<monday<< endl;
return 0;
}
解决的方法就是将定义全部放在头文件中
a.h
const int a = 3;
main.cpp
#include"a.h"
#include<iostream>
using namespace std;
enum Day{
monday = a
};
int main(){
cout <<monday<< endl;
return 0;
}
相关文章推荐
- const常量用extern声明定义的问题(extern变量不能在使用类里初始化)
- const定义的全局变量不能被其他文件访问,必须加extern 才能被访问吗?
- PHP_零基础学php_2变量、预定义变量、预定义常量、表达式、运算符、程序控制流程
- 能否在头文件中定义全局const变量?
- 多个cpp文件如何定义全局变量与常量
- C语言返璞归真之修改const常量和使用变量定义数组长度
- C语言为什么被const声明的变量不是一个常量表达式
- Java语言基础{Java_se(02)}-字面量和常量-变量的基本定义和使用-Java表达式-数据类型和分类-基本数据类型的转换-算数运算符-赋值运算符-比较运算符-三元运算符-逻辑运算符
- 定义变/常量和变量的初始化
- 头文件中定义 const 全局变量应注意的问题
- C语言之变量、常量(define\const)、变量的声明和定义
- 头文件中定义 const 全局变量应注意的问题
- pch文件的使用, 头文件使用, 常量(const)的定义,以及一些常用的宏定义
- 头文件中定义 const 全局变量应注意的问题
- 头文件中定义const全局变量应注意的问题
- const变量定义于头文件中
- PHP_零基础学php_2变量、预定义变量、预定义常量、表达式、运算符、程序控制流程
- 多个文件使用同一全局变量(未初始化) 以及局部变量重复定义
- [Wondgirl]ECMAScript6(ES6)(二)变量let、var和常量const的定义和区别
- 怎么通过反射的方式获取指定变量名称的值呢?比如说一个const类型的常量:const string aa=123