有没有办法用一些魔法写一个宏或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;另外,我必须在原型、函数和外部使用外部"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;在每一行上使用外部"C“似乎都不正确。
耽误您时间,实在对不起。
发布于 2016-07-15 23:46:34
如果您能够/允许使用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发布于 2016-07-15 23:41:33
您可以将定义分组到一个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发布于 2016-07-15 23:51:31
有没有一种方法可以用魔法写一个宏或类型定义函数,这样我就可以把下面的三行写得更小?
也许你正在寻找类似这样的东西:
#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宏可用于声明具有不同名称和可能的参数的其他函数、类型、指针三元组。
另外,我必须在原型、函数和外部使用外部"C“吗?
您不需要对指针声明应用extern "C",但是如果代码用于头文件,那么您可能需要一个普通的extern,如下所示。您可以考虑在所有单独的声明中省略extern "C",而将它们全部放入一个extern "C" { ... }块中。
https://stackoverflow.com/questions/38400035
复制相似问题