2

我编写了一个使用 const 全局变量的程序,我想知道是否可以通过在全局范围内、任何其他函数之外以及 main() 或 WinMain() 之外调用 Windows API 函数来初始化它。它是这样的:

#include "stdafx.h"
#include <iostream>
#include "windows.h"

const int i_HRes = GetSystemMetrics(SM_CXSCREEN);

int main()
{ std::cout << "Horizontal screen resolution: " << i_HRes << std::endl;
  std::cin.ignore();
  return 0;
}

它编译和运行没有错误,但我想知道在全局范围内调用 API 函数是否会导致消费者软件的某个地方出现问题。

4

2 回答 2

2

在您展示的示例中,这很好。i_hRes在可以调用 winapi 函数的上下文中调用隐式的、编译器生成的初始化代码。一般来说,当你的程序被允许做任何事情时,做 winapi 的事情是安全的。

但是,正如 Raymond 在评论中提到的那样,这是特定于您正在制作可执行程序的事实。如果您正在编写一个 DLL,那么调用外部函数可能是个坏主意。

于 2021-09-24T22:08:53.187 回答
2

我的建议是使变量可访问,但将初始化放在一个函数中,并使用程序环境生命周期中的某些东西来触发和初始化,当事情可以改变时。这可能是在程序开始时以及屏幕分辨率更改时。因为它可能会改变,所以我也不建议让它保持不变。

但是,对于在全局范围内进行 Windows API 调用,从技术角度来看应该没问题,只要确保您了解何时调用该函数 - 在这种情况下是在程序初始化期间。如果您调用的函数依赖于已经可用的屏幕上下文或可用的窗口,它将失败。

于 2021-09-24T22:04:52.337 回答