c c 前置宣告 typedef問題

2021-06-21 16:17:01 字數 1013 閱讀 8983

前置宣告的好處很多, 比如能避免標頭檔案互相包含的衝突, 比如有時我們在乙個標頭檔案中只需要另乙個標頭檔案的某個型別定義, 只需要對它做一下前置宣告即可,

因為為了相對較小的目的要包含進來乙個很大的標頭檔案, 實在有些"不值", 況且這個標頭檔案可能還要被其它很多檔案再包含的, 這樣代價就更大了.

所以做前置宣告即可, 在原始檔真正需要的時候再包含那個標頭檔案.

之前也宣告過類和c++方式定義的struct, 今天遇到了乙個typedef的結構體, 結果前置宣告不奏效了.

網上查了些資料, 有的帖子沒有討論出結果, 有的直接定性typedef的不能前置宣告, 只能include進來.

幸好自己寫小例子多測試了一會, 發現語法上還是支援的. 舉例如下:

#a.h:

[cpp]  typedef struct my_time_t

my_time;

typedef struct my_time_t

my_time;

#b.h

[cpp]  struct my_time_t;

typedef struct my_time_t my_time;

void func(my_time* mt) {}

struct my_time_t;

typedef struct my_time_t my_time;

void func(my_time* mt) {}

#main.cpp

[cpp]  #include "a.h"

#include "b.h"

int main()

#include "a.h"

#include "b.h"

int main()

這樣就可以成功了. 在b.h中做前置宣告時, 先宣告有my_time_t這樣乙個struct, 然後說明my_time是由那個結構體typedef出來的,

這樣void func(my_time* mt);這個函式宣告就能編譯通過了.   直接做struct my_time;這樣的前置宣告是不被接受的.

C C 之類的前置宣告

c 中將 介面與實現分離 的兩個重要目的就是 降低檔案間的編譯依存關係 和 隱藏物件的實現細節 而實現這一目的的關鍵技術就是pimpl模式 pointer to implementation 也即是把乙個類所有的實現細節都 給另乙個類來完成,而自己只負責提供介面。而實現 pimpl模式 的關鍵又是 ...

前置宣告(Forward declaration)

前置宣告是指宣告乙個類或結構體而不定義它,比如 class a struct b 在宣告之後,定義之前,該類或結構體被稱為不完全型別 incompletion type 意思是,知道型別a和b,但不知道他包含哪些內容 不完全型別的使用有一些限制,不如不能用它來定義物件,但可以定義指象該型別物件的指標...

C 前置宣告

特點 被宣告的類不用重新編譯,節省編譯時間 比如a包含乙個指向b的指標,b包含a的乙個例項,這種情況下,使用前置宣告。易錯的點 class date class task1 因為分配器為d分配記憶體的時候,必須要知道 d的大小 主要應用場景是兩個標頭檔案相互包含的場景,建議僅將前置宣告用於解決迴圈引...