2016-11-02 2 views
1

При попытке компиляции извне при условии C++ кодовых, я столкнулся с запутанной проблемой:Поддерживает ли C++ глобальные заголовки во время компиляции?

Некоторых файлов заголовки пропускают #include <MyLibrary.h>, где MyLibrary является очевидной зависимостью, которая просто отсутствует, и предотвращение компиляции.

Мой вопрос: При компилировании кода на C++ существует ли способ автоматически включать заголовочный файл зависимостей без необходимости включать # в каждый из файлов .h/.cpp, где это необходимо? Другими словами, способ предоставить препроцессору C++ список файлов заголовков для автоматического включения при компиляции всего исходного кода?

Я понимаю, что это, вероятно, очень плохая идея, но я пытаюсь определить, был ли код, который мне был предоставлен, просто сломан, или если какой-то способ его можно скомпилировать без ручной фиксации каждого файла с отсутствием зависимостей.

+0

Не знаю, о чем я знаю. Предложение: вы уверены, что компилируете в правильном стандарте, и что у вас установлены эти библиотеки? – Asu

+1

1) C не C++ не C. 2) Ваш вопрос непонятен. Заголовки - это ** исходный код **. Они никоим образом не используются во время выполнения. И '# include' является стандартным способом использования внешних определений. О чем ты думаешь? – Olaf

+1

В Visual Studio это определенно способ сделать это - он будет содержать файл (ы) во всем файле .cpp в проекте. Это один из вариантов препроцессора. –

ответ

3

Стандарт языка C++ не поддерживает «глобальные заголовки», но отдельные компиляторы делают.

Это называется принудительное включение.

С Visual C++ это опция /FI, а с g ++ - опция -include.


С помощью Visual C++, однако, обычный способ включить общие заголовки, чтобы поместить тех, включает в файле stdafx.h, и включить этот файл в каждом ЕП, в первую очередь. Это часть предварительной компиляции заголовков Visual C++. Это проблематично, потому что когда он включен (и он включен по умолчанию в проекте Visual Studio), он изменяет правила предварительной обработки, поэтому некоторые стандартные коды могут не компилироваться, но это может значительно ускорить большие сборки.

+2

Анонимный downvoter: объясните, пожалуйста, ваш downvote, чтобы читатели могли более легко игнорировать ваши комментарии и голоса в будущем. Спасибо. –

2

Да, по крайней мере, с gcc и совместимыми: Используйте опцию -include. См. https://stackoverflow.com/a/3387518/3150802.

+0

Это очень плохая идея и бросает вызов строительным инструментам. – Olaf

+0

@Olaf Я никогда не использовал его, но я не могу сразу увидеть действительность любого требования. Можете ли вы уточнить? –

+0

Как, например, Скин обнаруживает дополнительные зависимости? Не говоря уже об изменении зависимостей, вам нужно отредактировать неожиданный файл (файл сборки), а не тот, на который действительно влияет (исходный код). Многое противоположно важному принципу «наименее неожиданного» дизайна. – Olaf