Как найти зависимости от заголовка для крупномасштабных проектов на Linux [закрытыми]

Когда вы используете 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"
11
задан Kara 12 December 2013 в 06:33
поделиться

11 ответов

Выезд makdepend

4
ответ дан 3 December 2019 в 06:49
поделиться

Ответы здесь дадут Вам инструменты, которые отслеживают #include зависимости. Но нет никакого упоминания об оптимизации и таком.

В стороне: книга "Крупный масштаб Разработка программного обеспечения C++" должна помочь.

4
ответ дан 3 December 2019 в 06:49
поделиться

Инструменты как doxygen (используемый с graphviz опциями) могут генерировать графы зависимостей для, включают файлы... Я не знаю, предоставили ли они достаточно обзора для того, что Вы пытаетесь сделать, но это могло стоить попробовать.

2
ответ дан 3 December 2019 в 06:49
поделиться

Сценарии Bash, найденные на странице, не являются хорошим решением. Это работает только над простым проектом. На самом деле, в крупном проекте, как описывают на странице заголовка, C-препроцессор (#if, #else...) часто используются. Только хорошее более сложное программное обеспечение, как makedepend или сканирования может дать хорошую информацию. gcc-E может помочь, но на крупном проекте его анализ результата является напрасно тратить время.

1
ответ дан 3 December 2019 в 06:49
поделиться

От корневого уровня исходного дерева и делают следующее (\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 видов с методической точностью рассчитывает в обратном порядке.

2
ответ дан 3 December 2019 в 06:49
поделиться

Используя философию Unix "склеивания многих мелких инструментов" я предложил бы писать короткий сценарий, который называет gcc с-M (или - MM) и - опции (OUTFILE) MF (Как детализировано здесь). Это генерирует списки зависимости для сделать инструмента, который можно затем проанализировать легко (относительно парсинга исходных файлов непосредственно) и извлечь запрошенную информацию.

3
ответ дан 3 December 2019 в 06:49
поделиться

IIRC gcc мог создать файлы зависимости.

0
ответ дан 3 December 2019 в 06:49
поделиться

Используйте кэш. Это будет хешировать исходные данные к компиляции и кэшировать результаты, которые решительно увеличат скорость этих видов компиляций.

Если Вы хотели обнаружить несколько, включает, так, чтобы Вы могли удалить их, Вы могли использовать makedepend, как Iulian Șerbănoiu предполагает:

makedepend -m *.c  -f - > /dev/null

даст предупреждение для каждого, которого несколько включают.

1
ответ дан 3 December 2019 в 06:49
поделиться

Это не точно, что Вы ищете, и это не могло бы быть легко установить, но может быть Вами, мог взглянуть на lxr: lxr.linux.no является browseable деревом ядра.

В поле поиска при вводе имени файла оно даст Вам, где оно включено. Но это все еще предполагает, и это не отслеживает объединенные в цепочку зависимости.

Возможно,

strace -e trace=open -o outfile make
grep 'some handy regex to match header' 
0
ответ дан 3 December 2019 в 06:49
поделиться

Если Вы хотите знать, какие файлы включены больше всего, используйте эту команду удара:

найти. - называют '.cpp' - должностное лицо egrep '^ [:space:]#include [[: пространство:]] + [" <] [[: альфа:] [:digit:]_.] + [">]' {} \;

| вид | uniq-c | вид-k 1rn, 1
| голова-20

Это отобразит лучшие 20 файлов, оцениваемых суммой времен, они были включены.

Объяснение: 1-я строка находит все *.cpp файлы и строки извлечения с "#include" директивой от него. 2-я строка вычисляет, сколько раз был включен каждый файл, и 3-я строка берет 20 главным образом включенных файлов.

1
ответ дан 3 December 2019 в 06:49
поделиться

Вы могли бы хотеть посмотреть на распределенную компиляцию, видеть, например, distcc

0
ответ дан 3 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: