☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

全局对象只应为常量

4.11 ID_nonConstGlobalObject
目录 › next › previous

非常量全局对象对外部的读写没有限制,破坏了面向对象的封装理念,不利于维护。

全局对象的初始化顺序和依赖关系也是开发与维护的难点,建议只允许基本类型的常量作为全局对象。

进一步讨论可参见 ID_nonPrivateData、ID_relyOnExternalObject。

示例:

char foo;               // Non-compliant
extern char bar;        // Non-compliant, worse
const char baz = 'c';   // Compliant

void fun() {
    do_something(foo, bar);
}

应将全局对象和相关函数封装成类:

class A {
    char foo;   // Compliant
    char bar;   // Compliant
public:
    void fun() {
        do_something(foo, bar);
    }
};

如果变量 foo、bar 确有全局意义,多个模块都需要访问,不妨将其单件化:

A& getGlobal() {
    static A obj;
    return obj;     // The object must be initialized before returning
}

用 getGlobal 函数获取对象,再由其成员函数对数据进行读写,有效实现封装理念,而且可以保证对象在使用之前已被初始化。

配置

onlyConstBasicTypeAllowed: 是否只允许基本类型的常量作为全局对象

相关

ID_nonPrivateData ID_relyOnExternalObject

参考

C++ Core Guidelines I.2 C++ Core Guidelines CP.3 C++ Core Guidelines R.6
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.