Если вы хотите знать, какие другие заголовки вытаскивают из определенного файла заголовка, самый простой способ сделать это - запустить включенный файл только на этапе препроцессора компилятора, а не полностью его компилировать. Например, если вы хотите знать, что <iostream>
тянет, создать файл, содержащий только:
#include <iostream>
затем препроцессировать его. С gcc
опция -E
запускает только препроцессор, не компилируя файл, и сбрасывает предварительно обработанный файл на стандартный вывод. Результирующий результат начинается с:
# 1 "t.C"
Это мой однострочный исходный файл.
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
Видимо, gcc
автоматически тянет в этом файле заголовка, независимо от того, что. Это можно игнорировать.
# 1 "<command-line>" 2
# 1 "t.C"
# 1 "/usr/include/c++/6.2.1/iostream" 1 3
Хорошо, теперь мы, наконец, добраться до фактического #include
заявления в моем исходном файле одной строки.Вот где мой <iostream>
является:
# 36 "/usr/include/c++/6.2.1/iostream" 3
# 37 "/usr/include/c++/6.2.1/iostream" 3
# 1 "/usr/include/c++/6.2.1/x86_64-redhat-linux/bits/c++config.h" 1 3
Итак, iostream
сама #include
s это «C++ - config.h», очевидно, внутренний заголовок компилятор заголовочный файл,.
Если я буду продолжать идти, я могу видеть, что <iostream>
тянет, что не удивительно, <ios>
, <type_traits>
, а также заголовочные файлы, как stdio.h
.
Оно не должно быть слишком трудно быстро написать небольшой скрипт, который принимает файл заголовка, запускает компилятор в фазе предварительной обработки, и производит хороший, форматированный список всех файлов заголовков, которые потянули в.
открыт файлы заголовков, которые вы включили? Почему это так важно? –
Обратите внимание, что нет необходимости иметь минимальный (и, следовательно, не переносимый!) Набор включений для стандартных заголовков; избыточные вклюают безвредны. 'cassert', я думаю, является * единственным * заголовком, который делает что-нибудь интересное, когда он включен несколько раз. – Hurkyl
Никогда не полагайтесь на такие неявно включенные заголовки, это детали реализации и могут меняться в любое время. Всегда указывайте нужные функции. –