如何在没有 windows.h 宏的情况下声明 OutputDebugStringA?

How do I declare OutputDebugStringA without windows.h macros?

您知道 Python 如何拥有 from urllib import *,但也提供 from urllib import request,所以您可以只导入那个符号吗?不幸的是 C/C++ 不提供那个,但这就是我想在这里做的:from windows.h import OutputDebugStringA,因为我只需要一个功能。这仅适用于个人项目。

我使用 cl.exe main.cpp /EP 进行预处理,它告诉我这应该有效

typedef char CHAR;
typedef  const CHAR *LPCSTR, *PCSTR;
__declspec(dllimport)
void
__stdcall
OutputDebugStringA(
     LPCSTR lpOutputString
    );

但我仍然遇到链接器错误: main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl OutputDebugStringA(char const *)" (__imp_?OutputDebugStringA@@YAXPEBD@Z) referenced in ...

为什么?

所以下面的技巧:

extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char* lpOutputString);

问题是 Windows API 是基于 C 的,因此要调用的函数是 C 函数,而不是 C++ 函数。

在 C++ 编译器下编译时的问题是函数名称被破坏(由于 C++ 使用函数重载)。因此函数名称最终与导入库中定义的实际函数名称不同(在本例中为 kernel32.lib)。因此,您会收到无法找到该函数的链接器错误。

修复方法是使用 extern "C" 作为函数的限定符,这样 C++ 就不会破坏函数名称。

但是,我推荐这个用于Windows开发,即不包括windows.h头文件。通过包含 windows.h 头文件可以避免此类问题。