基于 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
通过使用 #ifdef
s 删除部分代码,我已经追踪到函数声明的方式。我尝试过的任何东西都不起作用,这让我觉得我一定错过了一些非常基本的东西。
仍然适用于经典编译器的原始代码:
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 ...
中没有函数声明,我不知道为什么代码编译得很好
感谢所有看过这篇文章的人。
我有一些以前在 C++Builder 6 中编译和工作的代码。我想在 10.4.2 中重新编译它并构建 32 位和 64 位 Windows 目标。
现有代码使用经典编译器编译,但是当我尝试使用 clang 编译器编译时,我得到了可怕的 ICE:
Internal compiler error: 0 @ 00000000
通过使用 #ifdef
s 删除部分代码,我已经追踪到函数声明的方式。我尝试过的任何东西都不起作用,这让我觉得我一定错过了一些非常基本的东西。
仍然适用于经典编译器的原始代码:
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 ...
中没有函数声明,我不知道为什么代码编译得很好感谢所有看过这篇文章的人。