Как я могу контролировать, как gcc / g ++ автоматически включает заголовки? - PullRequest
8 голосов
/ 15 октября 2010

Раньше у меня возникали проблемы, когда я пытался перенести некоторый код C ++, написанный на Mac OS X, в систему Linux или пытался скомпилировать код, написанный для более старой версии gcc / g ++, с более новой версией:

Кажется, что некоторые (более старые?) Версии gcc / g ++ автоматически включают некоторые заголовочные файлы для вас.

Например, для кода, использующего printf, должно потребоваться #include <stdio.h>.И код, который использует memcpy должен требовать #include <string.h>.Но в зависимости от версии gcc, которую я использую, она иногда включает их для меня.

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

Кто-нибудь еще сталкивался с этим?Есть ли способ заставить gcc автоматически включать или не включать?Или есть способ узнать что это автоинклюзия?

Ответы [ 3 ]

5 голосов
/ 20 марта 2011

-include file Обрабатывать файл так, как будто #include «file» появляется в первой строке первичного исходного файла.Однако первым каталогом, в котором выполняется поиск файла, является рабочий каталог препроцессора, а не каталог, содержащий основной исходный файл.Если он там не найден, его ищут в оставшейся части цепочки поиска #include "..." как обычно.Если задано несколько параметров -include, файлы включаются в порядке их появления в командной строке.

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

3 голосов
/ 15 октября 2010

Вы уверены, что это не другие заголовки, которые тянут их, а на других платформах этого не делают?

0 голосов
/ 15 октября 2010

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

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

...