C++ 中 extern const 的用法

原文地址:http://zhidao.baidu.com/link?url=x5_CNFl7DzDsmx99Xrwh0ETMM9mowJicb4JVA7XGFD0CKUe8mL6AuXx1_nKL5jDomYgRoFJruGAdIrB0Y4mvlq


问题:

请问一下大家,在C++中,我想定义一个全局的符号常量,应该怎么写?我试了一下,在a.cpp中定义extern const double pi=3.14; b.pp中extern const double pi;可以通过编译运行。在a.cpp中定义const double pi=3.14; b.pp中extern const double pi;编译失败。
我还在有的地方看到,C++中,全局符号常量应写成,a.cpp中定义为extern "C" const pi=3.14;b.pp中写成extern "C" const pi;这种方法和a.cpp中写成extern const double pi=3.14; b.pp中extern const double pi;有什么区别么,那种写法规范点或好点呢?
 
答案:
我来说一下,具体原因应该是这个,常变量在定义的时候必须初始化,所以当你在a.cpp中定义extern const double pi=3.14; b.pp中extern const double pi;可以通过编译运行。因为当编译系统发现a.cpp中的全局常变量时,就知道它pi是常量,而换过来的时候,在a.cpp中定义const double pi=3.14; b.pp中extern const double pi;编译系统在编译a.cpp是没有问题的,但到了b.cpp中就会发现,有一个外部常量是没有初始化的,而常量是不能在声明后再进行定义的,所以编译系统会认为找不到它的定义,所以就出错。
对于extern "C"主要是因为c和c++编译器不同,它们对相同的函数名编译后生成的相同的标示不同,故而在引用c的库文件时必须使用extern “C”告诉编译器,它是c的函数,按c的规则编译。通常我们使用的标准头文件已被处理过。 貌似没有用于常量的声明。
追问
十分感谢,我是做数值计算的,对编程只是一知半解、了解很浅,想请教您一下,我做计算时,有许多物理常数定义为了常变量,这些常数基本是各个源文件可见的,像这样的全局常变量,怎样定义声明比较好?我找了下,基本有这几种方法:
1、只需要在某一个.cpp中定义,在使用的地方,extern声明即可
2、头文件中定义
3、在某一个.cpp中定义,在头文件中声明,在使用的地方,包含头文件
那种好点,还是都可以,还是有他方法?多谢
回答
方法很多,具体要看需要的情况,比如说,第一种,如果变量很多,就会有很多个extern声明,不过你说你有好多个常量,这个方法不适合你。

我对第二个方法持保留态度,在头文件中定义,当我们的cpp文件包含这个头文件的时候,事实上,是在每一个cpp文件中定义了一个常量。在程序中,实际上就有很多个同名常量,这有可能会造成命名冲突。不过,现在编译器优化性能很好,不知道是不是可以消除。

第三种方法,是标准做法。如果只有这三种方法选择的话,你可以使用第三种方法

最后,推荐你一种不要涉及到常量的方法,就是使用一个函数
double PI ()
{
    return 3.141592654;
}
这样子来定义常量


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值