问题:
请问一下大家,在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; } 这样子来定义常量