有没有办法用一些魔法写一个宏或者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;
另外,我是否必须使用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"在每一行上看起来都不正确。
感谢您的时间。
答案 0 :(得分:4)
如果您能够/允许使用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
答案 1 :(得分:2)
您可以将定义分组到一个extern "C"
中,如下所示:
#ifdef __cplusplus
extern "C" {
#endif
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 );
KeInitializeApc_t PKeInitializeApc;
#ifdef __cplusplus
}
#endif
答案 2 :(得分:2)
有没有办法用一些魔法写一个宏或者typedef,我可以把下面的三行写成更小的?
也许你正在寻找这样的东西:
#define NTDECLARE(name, args) \
extern "C" NTSTATUS NTAPI name args; \
extern "C" typedef NTSTATUS (NTAPI * name ## _t) args; \
extern name ## _t P ## name;
NTDECLARE(KeInitializeApc, ( PKAPC Apc,
PKTHREAD thread,
UCHAR state_index,
PKKERNEL_ROUTINE ker_routine,
PKRUNDOWN_ROUTINE rd_routine,
PKNORMAL_ROUTINE nor_routine,
UCHAR mode,
PVOID context ) )
当然,NTDECLARE
宏可用于声明具有不同名称和可能参数的其他函数,类型,指针三元组。
另外,我是否必须在原型,函数和外部使用extern“C”?
您不需要将extern "C"
应用于指针声明,但如果代码用于头文件,那么您可能需要一个普通的extern
,如图所示。您可以考虑从所有单个声明中省略extern "C"
,而是将它们全部放在extern "C" { ... }
块中。