Предупреждающее сообщение «Подразделение на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не вызовет исключения, поэтому некоторые разработчики будут иногда подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:
$value = @(2 / 0);
Но, как и при любом предупреждении, наилучшим подходом было бы отслеживать причину предупреждения и разрешать его. Причина предупреждения будет происходить из любого экземпляра, где вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (поскольку NULL == 0), потому что результат будет «неопределенным».
Чтобы исправить это предупреждение, вы должны переписать свое выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы не должны делиться или изменять значение на 1, а затем делить так, что деление приводит к эквиваленту того, что он разделен только дополнительной переменной.
if ( $var1 == 0 ) { // check if var1 equals zero
$var1 = 1; // var1 equaled zero so change var1 to equal one instead
$var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
$var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}
Вопросы, относящиеся:
Это может звучать очевидным для Вас, но мы пытаемся использовать предописания как можно больше, даже если это требует для выписывания длинных имен пространства имен, в которых находится тип (типы):
// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }
// Real stuff
namespace plotter {
namespace samples {
class Window {
logic::Plotter * mPlotter;
// ...
};
}
}
Это значительно уменьшает время для компиляции также на компиляторах других. Действительно это относится ко всем конфигурациям:)
Используйте шаблон Дескриптора/Тела (также иногда известный как "pimpl", "адаптер", "декоратор", "мост" или "обертка"). Путем изоляции реализации классов в .cpp файлы они должны только быть скомпилированными однажды. Большинство изменений не требует изменений в заголовочном файле, таким образом, это означает, что можно внести довольно обширные изменения, только требуя, чтобы один файл был перекомпилирован. Это также поощряет осуществлять рефакторинг и писать комментариев и модульных тестов, так как время компиляции уменьшено. Кроме того, Вы автоматически разделяете проблемы интерфейса и реализации, таким образом, интерфейс Вашего кода упрощен.
Если у Вас есть большие сложные заголовки, которые должны быть включены большинством .cpp файлов в Вашем процессе сборки, и которые не изменяются очень часто, можно предварительно скомпилировать их. В проекте Visual C++ с типичной конфигурацией это - просто вопрос включения их в stdafx.h. Эта функция имеет своих хулителей, но библиотеки, которые полностью используют шаблоны, склонны иметь много материала в заголовках, и предварительно скомпилированные заголовки являются самым простым способом ускорить сборки в этом случае.
Эти решения относятся и к отладке и к выпуску, и фокусируются на кодовой базе, которая является уже большой и громоздкой.
Предописания являются общим решением.
Распределенное здание, такой как с Incredibuild является победой.
код Продвижения от заголовков вниз в исходные файлы может работать. Маленькие классы, константы, перечисления и так далее могли бы начаться в заголовочном файле просто, потому что он мог иметь используемый в нескольких единицах компиляции, но в действительности они только используются в одном и могли быть перемещены в cpp файл.
решение для А я не читал о, но использовал, должен разделить большие заголовки. Если Вы имеете горстку очень больших заголовков, смотрите на них. Они могут содержать сопутствующую информацию и могут также зависеть от большого количества других заголовков. Возьмите элементы, которые не имеют никаких зависимостей от других файлов... простые структуры, константы, перечисления и предописания и перемещают их от the_world.h
до the_world_defs.h
. Можно теперь найти, что много исходных файлов может теперь включать [только 112] и избежать включая все те издержки.
Visual Studio также имеет опцию "Show Includes", которая может дать Вам, смысл которых исходные файлы включают много заголовков и какие заголовочные файлы наиболее часто включаются.
Для очень общего включает, рассмотрите помещение их в предварительно скомпилированном заголовке.
Я использую Сборки Единицы (Экранная демонстрация расположенный здесь ).
Вопрос о скорости компиляции достаточно интересен, что у Stroustrup есть он в его FAQ.
Мы используем Incredibuild Xoreax для выполнения компиляции параллельно через несколько машин.
Наши машины разработки являются все четырехъядерными, и мы используем поддержки Visual Studio 2008 параллельная компиляция. Я не уверен относительно того, могут ли все выпуски VS сделать это.
Мы имеем файл решения приблизительно с 168 отдельными проектами и компилируем этот путь, занимает приблизительно 25 минут на наших четырехъядерных машинах, по сравнению с приблизительно 90 минутами на одноядерных ноутбуках, которые мы даем летним студентам. Не точно сопоставимые машины, но Вы получаете идею:)
С Visual C++ существует метод, некоторые называют Единицей, которая значительно улучшает время ссылки путем сокращения количества объектных модулей.
Это включает конкатенацию кода C++, обычно в группах библиотекой. Это, конечно, делает редактирование кода намного более трудным, и Вы столкнетесь с конфликтами пространства имен, если Вы не будете использовать их хорошо. Это мешает Вам использовать "нечто пространства имен использования";
у Нескольких команд в нашей компании есть тщательно продуманные системы, чтобы взять нормальные файлы C++ и связать их во время компиляции как шаг сборки. Сокращение во времена ссылки может быть огромным.
Также интересная статья Неда Бэтчелдера: http://nedbatchelder.com/blog/200401/speeding_c_links.html (о C ++ в Windows).