你应该把全局常量放在C ++程序中的哪个位置?

时间:2010-03-05 13:41:20

标签: c++ global-variables

您将全局常量放在C ++应用程序中的哪个位置?例如,你会把它们放在一个班级吗?在结构?

6 个答案:

答案 0 :(得分:13)

我会使用一个名称空间来表示与单个类没有很强关联的全局常量。在后一种情况下,我会把它们放在那个班级里。

真正的全局(应用程序级)常量应该在应用程序的命名空间中(假设你的应用程序在它自己的命名空间内,应该是这样)。对于模块级常量,模块自己的命名空间是自然的位置。

答案 1 :(得分:5)

最好的方法是将它们放在它们所属的同一命名空间中。大型C ++应用程序通常会有许多模块,每个模块都有自己的常量集。每个模块都应该在命名空间中,其中也包含常量。

答案 2 :(得分:2)

对于单个.cpp文件的本地常量,最好的方法是在匿名命名空间中声明它们,如下所示:

namespace {
   int const seconds_per_minute = 60;
   int const minutes_per_hour   = 60;
}

对于需要对整个程序可见的常量,最简单的解决方案是为它们创建一个(命名的)namspace,并将其放在头文件中。

如果有(或可能)某些操作要与它们一起使用,那么您应该为它们创建一个singleton class。例如,我的程序有一个名为“configuration”的单例类很常见,它从配置文件或注册表中读取启动常量(类似于IP地址的东西,以及我不太想硬编码的东西)。那样的。

答案 3 :(得分:1)

作为一个简单的经验法则,我把它们放在任何地方都会导致它们没有刺激性的C风格前缀。

例如,如果你的常量被命名为mylib_foomylib_bar,那么它们应该在名称空间mylib中,并且是mylib::foomylib::bar

如果命名空间mylib包含常量circle_max_radiussphere_max_radiusrectangle_max_widthrectangle_max_height,其中Circle,Sphere和Rectangle是类,那么它们应该是静态类成员。

max不是一个“刺激性”的前缀,它是一个非常明智的前缀,因为它是一个描述性修饰符而不是占有性(“圈子的最大半径”)。所以它可以留下来。

答案 4 :(得分:1)

一种可能的方法是使用具有返回常量的静态成员函数的类。当我需要的常量不仅仅是基本类型或简单对象时,我会使用它。

class Constant
{
public:
     static const ComplexObject& getComplexObject()
     {
          static ComplexObject constObj = createComplexObject();
          return constObj;
     }
private:
     static ComplexObject createComplexObject()
     {
         ComplexObject obj;
         obj.setValue(1);
         return obj;
     }
}

答案 5 :(得分:0)

一个选项是将它们作为非静态成员放入类中,并将该类型的对象放在main()函数中。无论出于何种原因,当你发现自己需要时,这简化了使它们成为非全局