Как увидеть фактический порядок включения файлов после предварительной обработки? - PullRequest
7 голосов
/ 10 марта 2011

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

Зная, что каждый файл включен только один раз. Есть ли способ выяснить возможный порядок, в котором будут включены все заголовки?

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

Редактировать

Причина, по которой я спрашиваю, заключается в том, что мне нужно включить заголовочные файлы в файл интерфейса SWIG в правильном порядке, чтобы избежать генерации странных оболочек SWIGTYPE_p_ *.

Обновление

Спасибо за ответы. Использование cpp -H кажется очень полезным. Однако я не могу найти grep или sed эти результаты, чтобы получить простой список файлов заголовков в правильном порядке и без дубликатов.

Ответы [ 3 ]

14 голосов
/ 10 марта 2011

Используйте cpp -H. Это печатает заголовки, используемые для стандартной ошибки. Пример:

$ cpp -H -I../../include base64.cpp 2>&1 >/dev/null | head
. /usr/include/c++/4.4/cstring
.. /usr/include/c++/4.4/i486-linux-gnu/bits/c++config.h
... /usr/include/c++/4.4/i486-linux-gnu/bits/os_defines.h
.... /usr/include/features.h
..... /usr/include/bits/predefs.h
..... /usr/include/sys/cdefs.h
...... /usr/include/bits/wordsize.h
..... /usr/include/gnu/stubs.h
...... /usr/include/bits/wordsize.h
...... /usr/include/gnu/stubs-32.h

Подробнее см. Руководство GNU cpp .

РЕДАКТИРОВАТЬ Вот небольшой скрипт на Python, который покажет порядок включения, при условии, что все заголовки содержат охранники:

import sys
seen = set()
for ln in sys.stdin:
    dots, header = ln.rstrip().split(' ', 1)
    if x not in seen:
        seen.add(header)
        print header

(Вы должны иметь возможность перевести это на Awk или Perl, если Python не ваша чашка чая.)

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

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

скажем, у вас есть:

file.cpp

#include 'one.h'
#include 'two.h'

one.h

#include 'three.h'
#include 'header.h'

три.ч

#include 'four.h'

Препроцессор будет включать one.h, который будет включать в себя three.h, который будет включать в себя four.h. Теперь мы возвращаемся к one.h, и header.h будет включен, и, наконец, мы вернемся к file.cpp и two.h. Так что заказ будет

  1. one.h
  2. three.h
  3. four.h
  4. header.h
  5. two.h

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

0 голосов
/ 10 марта 2011

Если вы хотите, чтобы все стало более забавным, вы можете попробовать взглянуть на http://www.boost.org/doc/libs/release/libs/preprocessor материал ...

От всей души я думаю, что вы должны иметь возможность создать специальное значение внутри каждого заголовка, которое увеличивается с каждым включением файла. Как я уже сказал, взгляд на Boost-материал может дать вам некоторые идеи.

...