Используйте Tooling для работы с clang api, пожалуйста! Потому что следующий вопрос после «а как это скомпилировать» обычно «а почему системные заголовки не подключаются» — потому что в вашем примере вы фактически продублировали маленький кусочек драйвера, который делает очень много системно-зависимой магии за кулисами.
min = -2147483649; // минимально допустимое -2147483648
Здесь литерал -2147483649 имеет тип long, а затем происходит implicit conversion в int.
А если написать так:
min = -2147483648 — 1;
(или, как бы я написал, min = INT_MIN — 1;)
То получим переполнение знаковых чисел, так как оба операнда имеют тип int.
В общем если хотите продемонстрировать особенности дополнительного кода портабельно и не заходя на скользкие участки, предлагаю проще: измен ите в это упражнении тип на short. Тогда оба варианта:
min = -32769;
min = -32768 — 1;
будут работать корректно, так как все литералы тут имеют тип int и переполнения не происходит (неявное преобразование в short происходит после арифметики).
Совершенно верно, формат другой, но это не повод делать ошибки или оставлять простанство для неточностей.
Поэтому я и предлагаю убрать объявление с множественными деклараторами, так как это не важно для начинающих, но очень запутывает. А вот говорить что можно переполнять знаковые числа — это, что называется, учить плохому, так как в стандарте явно написано что так делать нельзя (тот факт что у вас на gcc получился «нужный» эффект ничего не доказывает). И знаковые/беззнаковые целочисленные типы тоже стоит вводить параллельно, а не общим списком, так как между знаковыми/беззнаковыми типами существует соответствие. Так, например, unsigned это просто сокращение от unsigned int и поэтому нет смысла показывать эту возможность учащимся: просто ТИП знаковый, unsigned ТИП — беззнаковый.
> При компиляции gcc выводится всего лишь предупреждение
Почитайте что такое UB. Я серьёзно. (Компилятор совершенно не обязан о нём предупреждать.) Вы вообще читали стандарт? У вас есть хотя бы копия черновика стандарта?
> Доходим до максимально, потом сразу идет минимальное и т.д.
Эта отличная абстракция громко разбивается о процессры, использующие one's complement (а не two's complement), которые поддерживает стандарт Си, определяя signed overflow как UB.
> Это одно и тоже, но и писать unsigned int тоже можно.
Спасибо, я в курсе. А в тексте книги на это нет и мелейшего намёка.
WindowProc(), TextOut(), InvalidateRect() не имеют никакого отношения к теме. Если хотите выложить весь код — выложите на гитхаб или ещё куда-то.
Вот и учатся решать задачи лишь бы как.
/etc/network/interfaces:
> Avoid hiding placement new that's needed by the stl containers
Не пробовал :) Вот был бы патч на дерево кланга…
Сейчас вчитался в код — вы используете ASTUnit, поэтому вполне возможно ваш код будет находить стандартную библиотеку. Извините если был не прав.
> основное ее назначение — позволить клиентскому коду обработать за один раз сразу несколько исходных файлов
В том числе. А также избавить клиентский код от необходимости разбираться в хитросплетениях объектов, которые ему непосредственно не нужны.
А так да — ничего особого, только делает ваш код короче раз в пять.
Fixed.
min = -2147483649; // минимально допустимое -2147483648
Здесь литерал -2147483649 имеет тип long, а затем происходит implicit conversion в int.
А если написать так:
min = -2147483648 — 1;
(или, как бы я написал, min = INT_MIN — 1;)
То получим переполнение знаковых чисел, так как оба операнда имеют тип int.
В общем если хотите продемонстрировать особенности дополнительного кода портабельно и не заходя на скользкие участки, предлагаю проще: измен ите в это упражнении тип на short. Тогда оба варианта:
min = -32769;
min = -32768 — 1;
будут работать корректно, так как все литералы тут имеют тип int и переполнения не происходит (неявное преобразование в short происходит после арифметики).
Поэтому я и предлагаю убрать объявление с множественными деклараторами, так как это не важно для начинающих, но очень запутывает. А вот говорить что можно переполнять знаковые числа — это, что называется, учить плохому, так как в стандарте явно написано что так делать нельзя (тот факт что у вас на gcc получился «нужный» эффект ничего не доказывает). И знаковые/беззнаковые целочисленные типы тоже стоит вводить параллельно, а не общим списком, так как между знаковыми/беззнаковыми типами существует соответствие. Так, например, unsigned это просто сокращение от unsigned int и поэтому нет смысла показывать эту возможность учащимся: просто ТИП знаковый, unsigned ТИП — беззнаковый.
Почитайте что такое UB. Я серьёзно. (Компилятор совершенно не обязан о нём предупреждать.) Вы вообще читали стандарт? У вас есть хотя бы копия черновика стандарта?
> Доходим до максимально, потом сразу идет минимальное и т.д.
Эта отличная абстракция громко разбивается о процессры, использующие one's complement (а не two's complement), которые поддерживает стандарт Си, определяя signed overflow как UB.
> Это одно и тоже, но и писать unsigned int тоже можно.
Спасибо, я в курсе. А в тексте книги на это нет и мелейшего намёка.