2011-07-07 43 views
3

聲明一個結構用typedef速記的typedef指針到恆定結構

typedef struct some_struct { 
int someValue; 
} *pSomeStruct; 

,然後將它作爲一個參數與常量聲明一些功能,意味着「const的some_struct *變種」

void someFunction1(const pSomeStruct var) 

原來變成

some_struct * const var 

這也在ISO C標準的6.7.5.1節中說明在這種情況下,'const'適用於指針,而不適用於它指向的數據。

所以,問題是 - 是否有聲明指針指向const結構在用typedef缺兵少將的符號的方式,或者必須始終有它特殊的單獨聲明:

typedef const struct some_struct *pcSomeStruct; 
void someFunction2(pcSomeStruct var) 

回答

8

基本上不typedef的指針:)

typedef struct some_struct {} some_struct; 

void some_function1(some_struct *var); 
void some_function2(const some_struct *var); 
void some_function3(some_struct *const var); 
void some_function4(const some_struct *const var); 

或者,不要在的typedef所有:d

struct some_struct {}; 

void some_function1(struct some_struct *var); 
void some_function2(const struct some_struct *var); 
void some_function3(struct some_struct *const var); 
void some_function4(const struct some_struct *const var); 
+0

這就是爲什麼我希望它缺兵少將:)雖然他們是完全明確的 – Ulterior

+0

速記不一定是好事功能參數與堵塞的話:是'cpu'短的重要補丁更新或其他什麼東西?我喜歡清晰的..ness – pmg

+3

@ user757808 - 我更喜歡在指針中看到「const」關鍵字,而不是看到「user_defined_const_pointer_typedef」,並且必須找出API用於const指針typedef的命名約定。每個知道C的人都知道'const int *'和'int * const'之間的區別。不是每個人都能自動看到'const some_struct'和'const_some_struct'之間的區別。 –

1

這些都是有效的:

typedef struct some_struct { 
    int someValue; 
} const * pSomeStruct; 

typedef struct some_struct { 
    int someValue; 
} const * const pSomeStruct; 

雖然這種風格並未在C++中廣泛使用。相反:

struct some_struct { 
    int someValue; 
}; 

struct some_struct { 
    int someValue; 
}; 

然後做單獨的typedefs。但是,那還沒有被廣泛使用。除了針對指針的常見原因之外,許多其他C++程序員和我寧願聲明像void foo (some_struct const * const)或類似的函數。

0

至於我的C型系統的理解去,你不應該。首先typedef聲明類型,reas是「指向結構的指針」。對它應用const在邏輯上創建「const指向結構」。向結構本身注入常量需要改變類型本身,所以它重新定義了類型。 AFAIK,C中的類型組合是增量式的,只能通過對現有類型應用修飾符來創建新類型,而不是注入。

無論如何,指針的typedef並不是一個好的風格。

+0

Win32 APi充滿了這樣的聲明。海事組織,它也提高了可讀性,如果命名適當。 – Ulterior

+4

Win32 API不是一個好的風格。其實,這是我見過的最糟糕的主要API之一。當所有指針操作都大聲指出它們是指針操作時,可讀性(和防錯性)得到改善。 –