В моем файле 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 или мне следует что-то изменить в своем коде?
@3CxEZiVlQ Внутри члена класса пространства имен?
Нет, внутри struct Memory
.
Непостоянная глобальная переменная может быть <ругательством удалено> для отладки. Поскольку все может изменить значение в любой момент и по любой причине без возможности отслеживания, все в вашей программе может иметь побочные эффекты. Отличное развлечение. Clang Tidy хочет, чтобы вы спаслись от этого ада.
Никогда не следует объявлять переменную static
в заголовке (если она не является членом класса). Когда заголовок содержит
static bool isMHInit = false;
это означает отдельную переменную isMHInit
в каждом файле *.cpp, в который включен заголовок. Если вы хотите иметь глобально доступную переменную, общую для всех исходных файлов, вы можете объявить ее как
inline bool isMHInit = false;
Однако использование неконстантных глобально доступных переменных — плохой дизайн, и Clang-tidy предупреждает вас об этом.
Если вы на самом деле используете переменную только в одном исходном файле, сохраните объявление как есть, но переместите его в файл *.cpp. Это делает дизайн немного лучше.
Спасибо! Будет ли лучшим подходом определение класса «Память», а затем использование isMHInit в качестве частной переменной?
@Surasia Вероятно, так и было бы, но вашей следующей проблемой будет избегать глобально доступной переменной Memory
. Альтернативно вы можете сделать переменную статической внутри вашей функции.
Это потенциальная проблема в вашем коде. Сделайте переменную частной и добавьте публичную статическую функцию получения.