2013-05-09 101 views
4

這件事在另一個關於SO的問題上有所涉及,但有些隨便,因爲它不是主要問題。由於我的困惑仍然存在,我正在另外提問。爲什麼{typedef int * PTR; const PTR p = #}不等於「const int * p = num」而是等於「int * const p = num」?

爲什麼下面的兩個語句相當於int* const p=&num而不是const int* p=&num當後者看起來更合乎邏輯和直觀時? typedef這種行爲的嚴格原因是什麼?

typedef int* PTR; 
const PTR p=# 

最後,在這個問題一個成員的言論,這是不好的做法,使用typedef版指針。但我已經看到它在很多書籍和網站中被廣泛使用,這似乎是一件很方便的事情。它使代碼更易於理解。那麼最後的話是什麼呢?應儘可能避免使用指針?

編輯:又會有怎樣爲typedef說法正確的語法,如果我們打算以下幾點:

const int* const p=# 

編輯:我無意中忘了問一件重要的事情。然後使用typedef語句的正確語法是什麼?

const int* p=#  //instead of the int* const p=&num that we got 

回答

4

通常,

const TYPE var = ini; 

聲明TYPE類型的const可變var。所以

const PTR p=# 

聲明PTR類型的變量constp,與num地址初始化。

一個typedef不是文本的別名,所以你不能只是其擴張取代typedef版名稱,看看它導致英寸

如果你想獲得

const int* const p=# 

與一個typedef,你必須typedef東西包括const int,例如

typedef const int *CI_ptr; 

,然後你可以寫

const CI_ptr p = # 

(但不這樣做,這是醜陋的)。

而對於

const int *p = # 

然後你可以寫

CI_ptr p = # 

最後,在這個問題一個成員的言論,這是不好的做法,使用typedef版pointers.But我所看到的它在許多書籍和網站中被廣泛使用,似乎是一件很方便的事情,這使得代碼更易於理解。

是否使代碼更容易理解或更少取決於。根據我的經驗,有一件事總是一件壞事,那就是指向名稱的指針類型,它隱藏了你正在處理指針的事實。

typedef struct list_node { 
    int value; 
    struct list_node next; 
} *node; 

例如是一個不幸的是常見的濫用。當你閱讀node這個類型時,你不會懷疑它是一個指針。至少輸入到node_ptr。但接下來,爲什麼typedef的指針在所有,typedef ing結構和使用node*更短,更清晰。

那麼最後的話是什麼呢?應儘可能避免使用指針?

它沒有最終的權威,所以它主要是你的決定。如果有公司/項目,請遵循公司/項目的編碼風格,如果您自己編碼,請使用您的判斷。

+0

我忘了添加2個重要的點。我已經將它們添加爲**編輯**,你可以好好研究一下嗎? – 2013-05-09 13:15:06

+0

有指針類型的typedefs的一個原因是當你使用它們作爲API之外的不透明對象時。所以'struct foo_magic_structure; typdef my_magic_structure * foo_handle;'然後你的API在每個地方引用'foo_handle'。當然,這比C++更適用於C語言。 – 2017-01-26 13:06:28

0

這是使用typedef作爲對象指針類型的問題之一。

限定符(const,volatile)永遠不會穿透typedef

這是一些編碼標準禁止使用typedef作爲對象指針類型的原因之一。

+0

你可以好好看看我的**編輯**,我剛剛添加到我的問題。 – 2013-05-09 13:11:36

+0

我添加了2個編輯。 – 2013-05-09 13:14:39

相關問題