2016-07-15 101 views
1

有没有办法编写一个宏或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”似乎不正确。

谢谢你的时间。

回答

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 
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

有没有写宏或一些魔术,我可以写下面的三条线的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" { ... }块中。

+0

谢谢约翰,我会用你的答案。我喜欢宏的:) – DebugMechanic