C++ 的 typedef 的應用依問

這是抄字一個程式碼的一小片段

為什麼這邊要加 星號呢?如果是型態取代 那用普通變數不就可以了?前面還加星號 通常是為了表達甚麼? 難道是指標= =?

typedef struct _DBGKD_DEBUG_DATA_HEADER32 { LIST_ENTRY32 List; ULONG OwnerTag; ULONG Size; } DBGKD_DEBUG_DATA_HEADER32,*PDBGKD_DEBUG_DATA_HEADER32 ;

請問 這樣代表什麼意義呢?

這又該如何使用?

Update:

順便可以問一下

#ifdef __cplusplus

extern "C" { 請問 extern 是在做甚麼呢?

#endif

這裡面的extern 是用來˙做什麼的嗎??

以前有用過一次 但是 後來忘記在哪用了= =

也就不記得是做什麼了= =

2 Answers

Rating
  • 其威
    Lv 7
    9 years ago
    Favorite Answer

    第一個問題(那個 typedef struct XXXXXX),請參考意見一 EdisonX 大的回答,他已經說明的相當清楚。

    至於第二個問題 extern "C",就讓我來解釋一下 :-)

    === 分隔線 ===

    在 C++ 中有「函式多載」這種東西。也就是說,你可以有兩個同名的函式:

    int func(int);double func(double);

    這兩個函式都叫 func,可是當你呼叫的時候傳入的東西是 int 的時候,他會呼叫 int 的版本,傳入 double 的時候會呼叫 double 的版本。

    func(10); // 呼叫 int func(int)func(10.0); // 呼叫 double func(double)

    可是在程式要編譯成目標檔的時候,基本上 linker 與 loader 不允許同名的 symbol 出現在一個 symbol table 中... 所以必須要有一種方法分辨 int func(int) 與 double func(double)。

    目前所有(至少我聽說過得)C++ 編譯器的作法都是:將型態也編進 symbol 中。例如(此處只是舉例,實際的 naming convention 會根據編譯器的不同而不同):

    int func(int) 編成 func_INTdouble func(double) 編成 func_DOUBLE

    這樣 linker 與 loader 就可以正確的連結、載入正確的函式。

    預設上,所有函式,即使你目前並沒有多載某個函式(例如只有 int func(int) 而沒有 double func(double)),他還是會將型態也一起編進名稱中。因為編譯器不知道你是否在別的程式檔案中會不會突然又想要多載這個函式...

    這樣一來的問題是,因為 C 與 C++ 是可以混用的,當 C 程式想呼叫 C++ 函式(例如使用某個 C++ Library)的時候,因為 naming convention 的差異,就會找不到函式。C 編譯器會去找 func,可是實際上他可能需要找 func_INT。

    所以,在 C++ 中提供了 extern "C" { ... } 這東西,表示在這個大括弧內的東西要使用 C 的 linkage(就是不 wrap symbol name)。但是同樣的,也就喪失了函式多載的能力。

    那個 #ifdef __cplusplus 是為了讓 C 還有 C++ 編譯器都能正常編譯。

    如果光寫

    extern "C" {

    int func(int);

    }

    那 C 編譯器會因為看不懂 extern "C" 這東西而出錯。

    所以必須要寫成

    #ifdef __cplusplus

    extern "C" {

    #endif

    int func(int);

    #ifdef __cplusplus

    }

    #endif

    這樣。因為預設上,C++ 編譯器會定義 __cplusplus 這個 macro,而 C 編譯器不會。

  • 9 years ago

    PDBGKD_DEBUG_DATA_HEADER32 相當於以指標型態宣告結構體 DBGKD_DEBUG_DATA_HEADER32

    DBGKD_DEBUG_DATA_HEADER32 *Pointer ;

    PDBGKD_DEBUG_DATA_HEADER32 Pointer;

    效果是一樣的。

    ----

    第二個問題,extern 該去翻書,

    但那段 code 是在 c++ 中,為相容使 C language 也可使用加上去的。

Still have questions? Get your answers by asking now.