【问题标题】:Can API function initialize const global variable?API 函数可以初始化 const 全局变量吗?
【发布时间】:2021-11-18 02:48:41
【问题描述】:

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

#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 函数是否会导致消费者软件的某个地方出现问题。

【问题讨论】:

  • 视情况而定。例如,如果您的模块是 DLL,则调用将从 DllMain 内部进行,这通常是不允许的。
  • 标准 C++ 中没有任何内容可以阻止在文件范围内使用函数调用的结果初始化 const。如果变量在 DLL 中,事情会更复杂——但其细节超出了标准 C++ 的范围。

标签: c++ constants


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 或者,如果该函数需要某些东西存在,它会很早就被初始化(至少可以这么说),我在你的回答中知道你解决了 winapi :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多