2016-07-15 123 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