基于 clang 的编译器可接受的 header 文件

Acceptable header file for clang based compiler

我有一些以前在 C++Builder 6 中编译和工作的代码。我想在 10.4.2 中重新编译它并构建 32 位和 64 位 Windows 目标。

现有代码使用经典编译器编译,但是当我尝试使用 clang 编译器编译时,我得到了可怕的 ICE:

Internal compiler error: 0 @ 00000000

通过使用 #ifdefs 删除部分代码,我已经追踪到函数声明的方式。我尝试过的任何东西都不起作用,这让我觉得我一定错过了一些非常基本的东西。

仍然适用于经典编译器的原始代码:

extern "C" {
BOOL WINAPI __declspec(dllexport) GetLogonSIDFromToken (HANDLE hToken, PSID *ppsid);
BOOL WINAPI __declspec(dllexport) GetCurrentProcessLogonSID (PSID *ppsid);
BOOL WINAPI __declspec(dllexport) GetLogonSIDFromAccountName(char *lpszUserName, PSID *ppsid);
VOID WINAPI __declspec(dllexport) FreeLogonSID (PSID *ppsid);
PSECURITY_DESCRIPTOR WINAPI __declspec(dllexport) AddAceToNewSecurityDescriptor(PSECURITY_DESCRIPTOR psd, PSID psid, DWORD dwType, DWORD dwFlags, DWORD dwMask);
BOOL WINAPI __declspec(dllexport) SetUserObjectNullDacl(HANDLE hObject);
BOOL WINAPI __declspec(dllexport) AddAceToUserObject(HANDLE hObject, PSID psid, DWORD dwType, DWORD dwFlags, DWORD dwMask);
BOOL WINAPI __declspec(dllexport) AddAceToWindowStation(HWINSTA hwinsta, PSID psid);
BOOL WINAPI __declspec(dllexport) AddAceToDesktop(HDESK hdesk, PSID psid);
}

现在我已经尝试了很多东西,并研究了 Windows SDK headers,但是如果我将其放入我的代码中:

extern "C" {
// this is lifted directly from winbase.h
WINADVAPI
BOOL
WINAPI
LogonUserExW (
    _In_            LPCWSTR lpszUsername,
    _In_opt_        LPCWSTR lpszDomain,
    _In_opt_        LPCWSTR lpszPassword,
    _In_            DWORD dwLogonType,
    _In_            DWORD dwLogonProvider,
    _Outptr_opt_ PHANDLE phToken,
    _Outptr_opt_ PSID  *ppLogonSid,
    _Outptr_opt_result_bytebuffer_all_(*pdwProfileLength) PVOID *ppProfileBuffer,
    _Out_opt_       LPDWORD pdwProfileLength,
    _Out_opt_       PQUOTA_LIMITS pQuotaLimits
    );

/*
BOOL
WINAPI
GetLogonSIDFromToken(
    _In_ HANDLE hToken,
    _Outptr_opt_ PSID *ppsid
    );
*/
/*
BOOL
APIENTRY
GetLogonSIDFromToken(
    _In_ HANDLE hToken,
    _Outptr_opt_ PSID *ppsid
    );
*/}

它编译得很好(但显然我的函数没有声明),但如果我取消注释第二个或第三个声明,我会收到 ICE 错误。

任何人都可以为我提供任何指示(没有双关语)吗?

不是看上去的样子

代码编译正常,header 中没有函数声明,但问题不在 header 本身。文件中有两个函数使用 __try __finally(Microsoft 扩展),clang 正式支持它们,但其中一个函数在 __finally 块的开头有一个标签.移除标签允许代码编译。

__finally
{
blockexit:
  ...

删除 blockexit: 标签允许代码编译。

如果 header ...

中没有函数声明,我不知道为什么代码编译得很好

感谢所有看过这篇文章的人。