写入(函数原型、函数指针、外部指针)更小
Writing (Function Prototype, Function Pointer, Extern Pointer) Smaller
有没有办法用一些魔法编写宏或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;
在每一行上使用 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
您可以将
定义分组到一个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
有没有办法用一些魔法编写宏或 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
宏可以用来声明其他函数、类型、指针三重奏,具有不同的名称和可能的参数。
另外,我是否必须在原型、函数和外部上使用外部"C"?
您不需要将extern "C"
应用于指针声明,但如果代码用于头文件,那么您可能确实需要一个普通extern
,如图所示。 您可以考虑从所有单独的声明中省略extern "C"
,而是将它们全部放在一个extern "C" { ... }
块中。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址