2014-10-13 2 views
4

В моем стандартном C99 документе (на самом деле бесплатный проект комитета с сентября 2007 г.), Приложение I Общие предупреждения 2 говорится, чтоПредупреждение C99 о назначении указателя void указателю на непустоту?

(when) an implicit narrowing conversion is encountered, such as the assignment of a long int or a double to an int, or a pointer to void to a pointer to any type other than a character type (6.3)

является одним из немногих из наиболее распространенных ситуаций, когда реализация может сгенерировать предупреждение.

Хорошо, тогда не должно быть вероятного, что компилятор c сплет предупреждение на код, например int *p = malloc(sizeof(*p))? Хотя в коде C кажется более распространенным, чтобы не делать malloc s.

+0

«Может генерировать» может означать, что если компилятор знает, что информация не потеряна, она не будет предупреждать? Например, если вы присвоите результат «malloc» неподходящему указателю на сегментированную архитектуру, вы получите предупреждение. –

ответ

2

С C99 Annex I, где цитата из:

реализация может генерировать предупреждения во многих ситуациях, ни один из которых указаны в рамках настоящего стандарта. Ниже приведены некоторые из наиболее распространенных ситуаций.

Оперативная фраза здесь «может генерировать». Язык стандартов очень точен. Если они хотели настаивать на том, что предупреждение было сгенерировано, они использовали бы фразу «должен генерировать» или «должен генерировать».

Вероятно, если ваша среда была такой, где доступ к неконтролируемым значениям типов данных (например, слово на границе без слов) приведет к катастрофическому сбою (например, к ошибке шины), компилятор предупредит вас о такая вещь.

0

Нет, он не должен генерировать предупреждение при назначении void* другому указателю, так как это именно то, для чего выдумана конструкция void*. Это общий указатель, который может быть преобразован в любой другой указатель данных. Это никоим образом не сравнимо с сужением конверсии целочисленных типов, где у вас может быть потеря информации. Здесь ничего не потеряно.

Кроме того, я нахожу, что сужение предупреждающего бизнеса, которое наступает сейчас в C++, с компиляторами C++, переходящими на C++ 11, очень раздражает. По крайней мере, в C сужение преобразования в беззнаковый целочисленный тип очень точно определено, и компилятор не должен лаять.

Смежные вопросы