Этот вопрос действительно показывает историю JavaScript! Теперь мы можем избежать блочного сканирования с помощью функций стрелок и обрабатывать петли непосредственно из узлов DOM с использованием методов Object.
const funcs = [1, 2, 3].map(i => () => console.log(i));
funcs.map(fn => fn())
const buttons = document.getElementsByTagName("button");
Object
.keys(buttons)
.map(i => buttons[i].addEventListener('click', () => console.log(i)));
<button>0</button><br>
<button>1</button><br>
<button>2</button>
В дополнение к рассмотрению каталога, содержащего «заголовки систем», -isystem
изменяет список поиска заголовков, помещая аргумент каталога в начало каталогов заголовков системы. Если каталог уже существует в списке поиска, он удаляется из его текущего местоположения.
Начиная с (по крайней мере) GCC 6.1.1, некоторые заголовки C ++, такие как cmath
, используют #include_next
для обезьяны -patch C ++ для стандартных заголовков C. См. . Почему & lt; cstdlib> сложнее, чем вы думаете для получения дополнительной информации. Например, cmath
имеет строку:
#include_next <math.h>
#include_next
, в отличие от обычного оператора #include
, запускает поиск файла в следующей записи в пути поиска каталога include, а чем в верхней части пути поиска. Поскольку -isystem /usr/include
перемещает /usr/include
в путь поиска до каталога, содержащего cmath
, math.h
не может быть найден.
Подробно, путь поиска для команды g++ -I /usr/include
-
/usr/include/c++/6.1.1
/usr/include/c++/6.1.1/x86_64-pc-linux-gnu
/usr/include/c++/6.1.1/backward
/usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/include-fixed
/usr/include
(/usr/include
- системный каталог, аргумент -I
ничего не делает.)
cmath
находится по пути /usr/include/c++/6.1.1/cmath
, который является первым элементом путь поиска. math.h
можно найти в
/usr/include/math.h
/usr/include/c++/6.1.1/math.h
Использование #include_next <math.h>
в cmath
гарантирует, что копия math.h
в /usr/include/c++/6.1.1
пропущена и что используемая копия - /usr/include/math.h
.
С g++ -isystem /usr/include
путь поиска -
/usr/include
/usr/include/c++/6.1.1
/usr/include/c++/6.1.1/x86_64-pc-linux-gnu
/usr/include/c++/6.1.1/backward
/usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/include-fixed
Теперь использование #include_next <math.h>
пропускает /usr/include/c++/6.1.1
, а также /usr/include
, который находится над ним в путь поиска. В результате компилятор не может найти любую копию math.h
.
Чтобы подвести итог, будьте осторожны при использовании -isystem
для его побочных эффектов с ошибкой; если включенная директория уже находится в пути поиска, порядок пути может быть изменен, и GCC может сообщать об ошибках.
Должно быть что-то вроде следующего Makefile
:
llvm.include.dir := $(shell $(LLVM_CONFIG) --includedir)
include.paths := $(shell echo | cc -v -E - 2>&1)
ifeq (,$(findstring $(llvm.include.dir),$(include.paths)))
# LLVM include directory is not in the existing paths;
# put it at the top of the system list
llvm.include := -isystem $(llvm.include.dir)
else
# LLVM include directory is already on the existing paths;
# do nothing
llvm.include :=
endif
Это устанавливает make
переменную llvm.include
как -isystem <dir>
или ничего, в зависимости от того, действительно ли она нужна или нет.