`-система ', созданная путем создания тревожного порядка поиска заголовков с GCC 6 [duplicate]

Этот вопрос действительно показывает историю 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>

2
задан Tommy McGuire 13 May 2016 в 20:36
поделиться

1 ответ

В дополнение к рассмотрению каталога, содержащего «заголовки систем», -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> или ничего, в зависимости от того, действительно ли она нужна или нет.

2
ответ дан Tommy McGuire 27 August 2018 в 23:25
поделиться
Другие вопросы по тегам:

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