命名空间内的 extern const 和静态 const 类成员之间的区别

Difference between extern const inside namespace and static const class member?

本文关键字:const 成员 区别 之间 extern 命名空间 静态      更新时间:2023-10-16

最好在某个中心点定义常量(例如某些字符串或数字)。为了保持代码的可读性,还希望能够方便地访问这些常量。在我研究实现这一目标的良好实践期间,我现在找到了以下两种解决方案(https://stackoverflow.com/a/9649425/2776093)。

FoodConstants.h:

namespace FoodConstants {
    namespace Fruits {
        extern const string Apple;
        ...
    }
    ...
}

食物常数.cpp:

namespace FoodConstants {
    namespace Fruits {
        const string Apple = "apple" ;
        ...
    }
    ...
}

食物常数2.h:

class FoodConstants {
public:
    class Fruits {
    public:
        static const string Apple;
        ...
    }
    ...
}

食物常数2.cpp:

const string FoodConstants::Fruits::Apple = "apple"
...

对于这两种解决方案,我都可以在包含 .h 的程序中的任何地方使用 FoodConstants::Fruits::Apple 访问苹果常量。初始化在同一编译单元中完成,避免了初始化问题。我注意到一个区别:对于第二个解决方案,我不能,例如,做一个"使用命名空间 FoodConstants"来缩写对 Fruits::Apple 的字符串常量的访问。

还有其他区别吗?有没有像这样组织常量的首选方法?

还有其他区别吗?

是的,有。我可以看到两个:

  1. 使用类解决方案,您可以控制可访问性(public/protected/private),这是命名空间解决方案无法实现的。

  2. 使用命名空间,您可以将声明拆分到多个文件中,而类解决方案则无法做到这一点,因为类定义(包含所有成员的声明)必须在单个文件中给出。