Проверка файла заголовка на наличие зависимостей во время компиляции
Предоставляют ли компиляторы возможность автоматически проверять, включают ли каждый исходный файл (и связанный с ним заголовочный файл, если таковой имеется) все остальные требуемые заголовки? Или, по крайней мере, выдать предупреждение, скажем, если требуемый заголовок не включен явно?
Например, я хотел бы, чтобы компилятор сообщал, когда я делаю что-то вроде этого:
header1.h
#include <string>
...
header2.h
#include "header1.h"
#include <iostream>
std::string blah; //<-- issue warning here, <string> not included explicitly
...
source2.cpp
#include "header2.h"
...
cout << endl; //<-- issue warning here, <iostream> not included explicitly
Я использую g++ и Visual Studio, поэтому мой вопрос в первую очередь относится к этим компиляторам. Спасибо!
1 ответ
Насколько я знаю, автоматического способа для этого не существует.
Я предлагаю ограничивать включения в заголовки только тем, что необходимо для "интерфейса", определенного в.h. В стандартах кодирования C++ (Саттер, Александреску) вы можете найти элемент, который решает эту проблему явным образом (он называется "Сделать заголовочные файлы самодостаточными").). Я цитирую:
Ведите себя ответственно: убедитесь, что каждый написанный вами заголовок является компилируемым автономно, так как он включает любые заголовки, от которых зависит его содержимое
а также
Но не включайте заголовки, которые вам не нужны; они просто создают ложные зависимости. Рассмотрите эту технику, чтобы помочь обеспечить самодостаточность заголовка: В вашей сборке скомпилируйте каждый заголовок изолированно и проверьте, что нет ошибок или предупреждений.
Более того, вы всегда должны сначала включать свой собственный.h, поскольку это максимизирует вероятность обнаружения ошибок включения.
Во всех случаях заголовки должны быть заменяемыми, так что, если ваш файл включает в себя ах и бх, должны выполняться оба возможных порядка.