Как установить приоритет конфликтующих заголовков c ++

Представьте, что у вас есть два something.h в двух разных каталогах. Вы не можете писать в эти каталоги и не иметь root-доступа.

У вас есть код, который делает:

#include 

Как вы определяете использование something.h в определенном каталоге и игнорируете другое?

3
добавлено
Просмотры: 1
de
бум! увеличено на 20%!
добавлено автор madreblu, источник

2 ответы

Как правило, список каталогов, которые имеют право на поиск того, что считается системой, включает (с использованием угловых скобок в #include), предоставляется как набор -I для компилятора. Часто они включают каталоги, указанные в make-файлах или файлах проекта.

Многие (но не обязательно все) компиляторы будут соблюдать порядок каталогов, перечисленных как включенные каталоги, поэтому вы должны быть в состоянии выбрать свое предпочтение, изменив этот порядок в своих файлах make-файлов. Однако в некоторых компиляторах это может быть сложно, так как некоторые каталоги считаются всегда включенными (например, gcc по умолчанию предполагает, что вы включили /usr/include ). Другими словами, это очень специфическая реализация.

Если вы используете не угловые скобки, а двойные кавычки, вы можете просто указать нужный файл прямо как #include "dir/file.h" .

1
добавлено
Одна версия находится в/usr/include/foo/... другая находится в моем домашнем каталоге. Когда я укажу с помощью #include "fullpath to home directory header" , он по-прежнему выбирает/usr/include one
добавлено автор madreblu, источник
Да, и даже с -I, он все еще смотрит на/usr/include/foo/one
добавлено автор madreblu, источник
никаких изменений, кроме того, нет инструкции перед добавлением в программу/usr/include/foo/header.
добавлено автор madreblu, источник
@madreblu Вы также попробовали вариант -I ?
добавлено автор πάντα ῥεῖ, источник
@madreblu: попробуйте использовать #include как самую первую строку в вашем .cpp-файле. В противном случае этот заголовок может быть затянут другим #include над ним
добавлено автор mvp, источник
вы должны рассказать больше о том, что происходит - очень сложно угадать, что вы видите. предполагая, что вы используете gcc, это официальный документ о порядке поиска: gcc.gnu. орг/onlinedocs/CPP/Поиск-Path.html
добавлено автор mvp, источник
Заметка о каталогах по умолчанию из документов, связанных каталогами mvp: -I , имеет приоритет над ними. Однако вы не можете изменить порядок каталогов по умолчанию, используя флаг -I . Вы должны либо использовать -nostdinc , чтобы игнорировать все значения по умолчанию, а затем -I их в том порядке, в котором вы хотите, или можете связать нужные заголовки с каталогом, отличным от по умолчанию, и использовать -I .
добавлено автор brian, источник

попробуйте использовать:
#include "../ directory/something.h"
Обратите внимание, что GCC ищет заголовки, используя путь поиска .
Вы также можете попросить GCC искать файлы заголовков в указанных каталогах. Используйте -iquote dir , чтобы добавить каталог dir в список списка каталогов для поиска файлов заголовков.

1
добавлено
ставя полный путь к .h, который я хочу, не работает.
добавлено автор madreblu, источник
попробуйте использовать -iquote
добавлено автор bane, источник
также см. это: Параметры каталога
добавлено автор bane, источник