Каковы причины для приведения пустого указателя? - PullRequest
6 голосов
/ 07 апреля 2010

Я изучаю C ++ с нуля, и поэтому у меня нет достаточного понимания языка C. В C ++ вы не можете привести пустой указатель на что-либо, и я понимаю причины этого. Тем не менее, я знаю, что в C вы можете. Каковы возможные причины этого? Просто кажется, что это огромная дыра в безопасности типов, что (мне) кажется плохой вещью.

Ответы [ 3 ]

13 голосов
/ 07 апреля 2010

Вы можете привести void* к другому указателю на обоих языках.Возможно, вы имели в виду неявно.

Это очень удобно в C, чтобы не быть явно об этом.В C ++ у нас есть шаблоны, поэтому для написания универсального кода не требуется void* приведение и еще много чего.В Си нет выбора.Универсальный контейнер должен содержать void* для объектов, и гораздо проще многократно сказать mydata* d = node;, чем mydata* d = (mydata*)node;.

Так что это в значительной степени, как вы сказали.В C-типе безопасность вообще не получала такого большого внимания, как в C ++, особенно когда дело дошло до void*, потому что предполагалось, что это простой общий указатель на что-либо.В C ++ это не нужно, поэтому лучше указывайте это, когда вы имеете дело с этим.

1 голос
/ 07 апреля 2010

Каковы возможные причины для [приведения указателя void * в C]? Разве это не гигантская дыра в безопасности типов?

Это единственный возможный способ поддержки полиморфизма, или универсальное программирование. Нет другого способа создать, например, универсальную хэш-таблицу. Полиморфизм в C дико небезопасен, но это единственный полиморфизм.

Радуйтесь, что C ++ обладает параметрическим полиморфизмом (одна из многих функций шаблонов)

0 голосов
/ 07 апреля 2010

Одна из причин: если вы используете sort для сортировки массива структур и у вас есть функция сравнения для двух структур, вам нужно будет привести указатели void к указателям на структуры, чтобы получить доступ к членам структуры. .

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