сокращенный указатель на typedef для константной структуры - PullRequest
3 голосов
/ 07 июля 2011

Объявление структуры с typedef

typedef struct some_struct {
int someValue;
} *pSomeStruct;

и последующая передача ее в качестве параметра некоторой функции с объявлением const, подразумевая, что 'const some_struct * var'

void someFunction1( const pSomeStruct var )

превращается встать

some_struct * const var

Это также указано в разделе 6.7.5.1 стандарта ISO C, в котором говорится, что «const» в данном случае применяется к указателю, а не к данным, на которые он указывает.

Таким образом, вопрос в том, есть ли способ объявить указатель на const структуру в сокращенной записи с помощью typedef, или для этого всегда должно быть специальное отдельное объявление:

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

Ответы [ 3 ]

8 голосов
/ 07 июля 2011

Как правило, не вводите указатели defdef :):

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);

Или вообще не вводите def: 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);
1 голос
/ 07 июля 2011

Они также действительны:

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;
};

, а затем делайте отдельные определения типов. Но тогда это также не широко используется. Многие другие программисты на C ++ и я предпочли бы объявлять ваши функции как void foo (some_struct const * const) или аналогичные, за исключением обычных причин против указателей.

0 голосов
/ 07 июля 2011

Насколько я понимаю систему типов C, вы не должны этого делать. Сначала typedef объявляет тип как «указатель на структуру». Применение const к нему логически создает «указатель const на структуру». Внедрение const'ности в саму структуру потребует изменения самого типа и, следовательно, повторного определения типа. AFAIK, составление типов в C является инкрементным, и вы можете создавать новые типы только путем применения модификаторов к существующим, а не внедрения.

В любом случае введите определение указателя в не очень хорошем стиле.

...