В чем разница между typedef const struct * CGPath и typedef struct * CGPath? - PullRequest
0 голосов
/ 01 июня 2010

Я нашел это в заголовочном файле CGPath.h. Мне любопытно, что делает эта константка?

typedef struct CGPath *CGMutablePathRef;
typedef const struct CGPath *CGPathRef;

Мое предположение: если я наберу что-то как const, оно будет постоянным, неизменным и не может быть изменено никаким образом Имеет ли это смысл?

Ответы [ 4 ]

3 голосов
/ 01 июня 2010

Да, const означает, что вы не можете изменить путь извне.


Для библиотек, основанных на CoreFoundation, const - это скорее хак, позволяющий изменяемым объектам использовать неизменяемые методы без приведения, а не и наоборот. Это значит

CGMutablePathRef mpath;
...
CGPathContainsPoint(mpath, ...);

компилируется нормально, потому что Foo* может быть неявно преобразован в const Foo*, но

CGPathRef path;
...
CGPathAddRect(path, ...);

выдаст ошибку, потому что const Foo* не может быть безопасно преобразован в Foo*.

2 голосов
/ 01 июня 2010

const T* означает, что тип является указателем и что указатель не может быть изменен с помощью этого указателя. (Это не обязательно означает, что pointee никогда не может измениться; он может быть изменен, например, с помощью другой, не const ссылки на него.)

1 голос
/ 02 июня 2010

const от стандарта C. Это означает, что разыменованный указатель не может быть назначен. Поэтому я не могу сделать:

GCPathRef p = &my_path;
*p = new_path;  // generates compiler error

Но учтите, что само p можно изменить:

p = &another_path; // this is OK.

Это совсем не хак, как предложил другой автор. Он был частью C на протяжении поколений.

1 голос
/ 01 июня 2010

«В любом случае» может быть преувеличением, но вы правы. Вы заметите, что один из них называется CGPathRef, а другой - CG Mutable PathRef.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...