Когда вы используете var
, вы создаете переменную в текущей области. - который в первом случае является областью функции user
.
Если вы не используете var
, у вас просто нет этой переменной в этой области (function
). И поскольку вы уже создали экземпляр переменной name
за пределами текущей области (globally
), вы получите это как переменную name
var name = "Paul";
function users () {
// var name; is essentially hoisted to here - the top of the current scope
if (!name) {
(var) name = "Jack"; // that hoisted var is set here
}
console.log(name);
}
users(); //outputs "Jack"
другой случай:
var name = "Paul";
function users () {
if (!name) {
name = "Jack"; // name is hoisted outside of the scope,
// but it already is declared as "Paul"
}
console.log(name);
}
users(); //outputs "Paul"
Ответы здесь дадут Вам инструменты, которые отслеживают #include зависимости. Но нет никакого упоминания об оптимизации и таком.
В стороне: книга "Крупный масштаб Разработка программного обеспечения C++" должна помочь.
Инструменты как doxygen (используемый с graphviz опциями) могут генерировать графы зависимостей для, включают файлы... Я не знаю, предоставили ли они достаточно обзора для того, что Вы пытаетесь сделать, но это могло стоить попробовать.
Сценарии Bash, найденные на странице, не являются хорошим решением. Это работает только над простым проектом. На самом деле, в крупном проекте, как описывают на странице заголовка, C-препроцессор (#if, #else...) часто используются. Только хорошее более сложное программное обеспечение, как makedepend или сканирования может дать хорошую информацию. gcc-E может помочь, но на крупном проекте его анализ результата является напрасно тратить время.
От корневого уровня исходного дерева и делают следующее (\t, символ табуляции):
find . -exec grep '[ \t]*#include[ \t][ \t]*["<][^">][">]' {} ';'
| sed 's/^[ \t]*#include[ \t][ \t]*["<]//'
| sed 's/[">].*$//'
| sort
| uniq -c
| sort -r -k1 -n
Строка 1 получает все включать строки. Строка 2 снимает изоляцию со всего перед фактическим именем файла. Строка 3 снимает изоляцию с конца строки, оставляя только имя файла. Строка 4 и 5 количеств каждая уникальная строка. Строка 6 видов с методической точностью рассчитывает в обратном порядке.
Используя философию Unix "склеивания многих мелких инструментов" я предложил бы писать короткий сценарий, который называет gcc с-M (или - MM) и - опции (OUTFILE) MF (Как детализировано здесь). Это генерирует списки зависимости для сделать инструмента, который можно затем проанализировать легко (относительно парсинга исходных файлов непосредственно) и извлечь запрошенную информацию.
Используйте кэш. Это будет хешировать исходные данные к компиляции и кэшировать результаты, которые решительно увеличат скорость этих видов компиляций.
Если Вы хотели обнаружить несколько, включает, так, чтобы Вы могли удалить их, Вы могли использовать makedepend, как Iulian Șerbănoiu предполагает:
makedepend -m *.c -f - > /dev/null
даст предупреждение для каждого, которого несколько включают.
Это не точно, что Вы ищете, и это не могло бы быть легко установить, но может быть Вами, мог взглянуть на lxr: lxr.linux.no является browseable деревом ядра.
В поле поиска при вводе имени файла оно даст Вам, где оно включено. Но это все еще предполагает, и это не отслеживает объединенные в цепочку зависимости.
Возможно,
strace -e trace=open -o outfile make
grep 'some handy regex to match header'
Если Вы хотите знать, какие файлы включены больше всего, используйте эту команду удара:
найти. - называют '.cpp' - должностное лицо egrep '^ [:space:]#include [[: пространство:]] + [" <] [[: альфа:] [:digit:]_.] + [">]' {} \;
| вид | uniq-c | вид-k 1rn, 1
| голова-20
Это отобразит лучшие 20 файлов, оцениваемых суммой времен, они были включены.
Объяснение: 1-я строка находит все *.cpp файлы и строки извлечения с "#include" директивой от него. 2-я строка вычисляет, сколько раз был включен каждый файл, и 3-я строка берет 20 главным образом включенных файлов.
Вы могли бы хотеть посмотреть на распределенную компиляцию, видеть, например, distcc