gpt4 book ai didi

c++ - WinAPI如何在未实现WinMain时确保编译失败

转载 作者:行者123 更新时间:2023-11-30 03:44:03 25 4
gpt4 key购买 nike

当您在 Visual Studio 中创建 Win32 项目并且没有定义 WinMain 函数时,您会遇到编译错误:

Error 1 error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

如何设计/实现此 API 设置以确保用户永远无法在不实现 WinMain 的情况下创建 Win32 应用程序?我正在创建一个 API,我还想在用户没有正确使用 API 或没有实现基本功能时放入编译错误。

我想使用类似东西的一个例子是:用户必须实现一个 App 类(基类或继承类)。因此,如果我能以某种方式在编译时检测到 App 类尚未实现,我也可以抛出编译错误。

WinAPI的实现是不是简单到没有实现的前向声明函数(保证编译失败)?即,

// Forward declaration with, intentionally, no function implementation
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow);

最佳答案

当启动一个程序时,操作系统加载模块然后调用初始化代码。哪个符号带有可以更改的初始化代码(入口点),但通常它类似于 winMainCRTStartupmainCRTStartup(如果我没记错的话)。现在,该函数由编译器供应商提供并链接到您的程序中。它首先调用初始化代码,例如全局变量的构造函数,然后委托(delegate)给各种形式的 main()winMain()。这也是编译失败的原因:由于始终包含初始化代码(通过其外部可见的入口点)并且它始终调用相应的主函数,因此缺少主函数将导致链接器错误。

请注意,简单的声明是不够的(你可以尝试过),你必须确保它声明的函数被实际使用。

关于您产生错误的方法,我认为它不可行,至少在编译时不可行。如果可能的话,我也会尽量避免使用库的这种严格限制。为什么您的应用程序中的库不应该有多个这样的类或多个用途?如果约束确实有意义,请考虑使用像许多窗口库一样的技术,这些库提供注册用户编写的实例的全局函数。然后,您可以向您的代码添加相应的检查,assert() 实例已注册。

关于c++ - WinAPI如何在未实现WinMain时确保编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com