写入(函数原型、函数指针、外部指针)更小

Writing (Function Prototype, Function Pointer, Extern Pointer) Smaller

本文关键字:指针 函数 更小 外部 写入 原型      更新时间:2023-10-16

有没有办法用一些魔法编写宏或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" { ... }块中。