如何定义和初始化非全局命名空间成员变量?

问题描述 投票:0回答:1

在我的

Memory.hpp
文件中,我有一个名为
isMHinit
:

的名称空间布尔值
namespace Memory
{
    static bool isMHInit = false;
    DWORD HookFunction(LPVOID pTarget, LPVOID pDetour, LPVOID pTrampoline, BOOL isWriteCopy);
    static UINT64 CheckCodeAccess(UINT64 startaddress);
    DWORD OnAccessHookFunction(PVOID pTarget, LPVOID pDetour, LPVOID pTrampoline, BOOL isWriteCopy);
}; // namespace Memory

Memory.cpp
里面,我使用并修改了它:

// this function is a member of Memory, I removed most functionality for brevity.
DWORD HookFunction(LPVOID pTarget, LPVOID pDetour, LPVOID pTrampoline, BOOL isWriteCopy)
{
    if (!isMHInit) {
        if (MH_Initialize() != MH_OK) {
            std::cout << "Error: MHInit failed." << "\n";
            return 1;
        }
        isMHInit = true;
    }

在执行 clang-tidy 时,我收到此警告,即使我在函数内明确修改了它:

变量“isMHInit”是非常量且全局可访问的,请考虑将其设为常量

这是 clang-tidy 的问题吗?还是我应该修改代码中的某些内容?

c++ clang++ clang-tidy
1个回答
1
投票

永远不应该在标头中声明变量

static
(当它不是类成员时)。当标题包含

static bool isMHInit = false;

这意味着包含标头的每个源文件中都有一个单独的变量

isMHInit
。如果你想在所有源文件之间共享一个全局可访问的变量,你可以将其声明为

inline bool isMHInit = false;

但是,使用非常量全局可访问变量是糟糕的设计,Clang-tidy 会警告您这一点。

如果您实际上仅在单个源文件中使用该变量,则保持声明不变,但将其移动到源文件中。这使得设计更好一点。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.