有没有一种方法可以用一些魔法来编写宏或 typedef,使我可以将下面的三行代码写得更小?
extern "C" NTSTATUS NTAPI KeInitializeApc( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context );
typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context );
extern "C" KeInitializeApc_t PKeInitializeApc;
此外,我是否必须在原型(prototype)、函数和 extern 上使用 extern "C"?如果我想要没有损坏的名字?
extern "C" NTSTATUS NTAPI KeInitializeApc( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context );
extern "C" typedef NTSTATUS (NTAPI *KeInitializeApc_t)( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context );
extern "C" KeInitializeApc_t PKeInitializeApc;
在每一行都使用 extern "C"似乎不正确。
感谢您的宝贵时间。
最佳答案
如果您能够/被允许使用 C++11,您可以尝试使用 decltype
,如下所示:
extern "C" {
NTSTATUS NTAPI KeInitializeApc( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context );
using KeInitializeApc_t = decltype(&KeInitializeApc);
KeInitializeApc_t PKeInitializeApc;
}
编辑:我错过了那里的 c
标签。如果您想编写代码使其同时适用于 C 和 C++,您可以尝试:
#ifdef __cplusplus
extern "C" {
#endif
typedef NTSTATUS NTAPI KeInitializeApc_f( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context );
KeInitializeApc_f KeInitializeApc;
typedef KeInitializeApc_f *KeInitializeApc_t;
KeInitializeApc_t PKeInitializeApc;
#ifdef __cplusplus
}
#endif
关于c++ - 写(函数原型(prototype)、函数指针、外部指针)更小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400035/