Как гарантировать, что iostream не был включен? - PullRequest
1 голос
/ 25 октября 2019

Рекомендуется использовать #include <iosfwd> в заголовочных файлах и #include <iostream> только в файлах cpp . Я пытаюсь переместить много #include <iostream> из заголовочных файлов в файлы cpp в существующем проекте.

Есть ли способ гарантировать, что ни один файл в дереве зависимостей #include не имеет #include -d? <iostream>? В идеале, чтобы компиляция не удалась, например static_assert.

1 Ответ

2 голосов
/ 25 октября 2019

C ++ не может сделать это на уровне языка. Даже некоторые предложения в комментариях, такие как проверка, чтобы увидеть, существует ли уже свойство заголовка iostream, не будут работать. Причина в том, что заголовки не изолированы;ничто не мешает файлу .cpp включать заголовок iostream, за которым следует ваш собственный заголовок. Проверка свойства в заголовке дала бы ложный положительный результат, поскольку его включал не заголовок.

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

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

...