2016-07-15 2 views
1

マクロやtypedefを書くには、3行下の小さな行を書くことができますか?書く(関数プロトタイプ、関数ポインタ、Extern Pointer)Small

また、プロトタイプ、関数、externに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; 

1行に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

マクロを書いたり、私は以下の3行を書くことができますいくつかの魔法で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にextern "C"を使用する必要がありますか?

あなたは、ポインタ宣言にextern "C"を適用する必要はありませんが、コードは、ヘッダファイルのために意図されている場合示すように、あなたはおそらく、平野externが必要です。すべての個々の宣言からextern "C"を省略し、それらをすべてextern "C" { ... }ブロックに入れることを検討できます。

+0

ありがとうジョン、私はあなたの答えを使用します。私はマクロが好きです:) – DebugMechanic