Проблема, с которой я сталкиваюсь, заключается в том, что при использовании класса (один заголовок, один файл cpp) мне интересно, когда включается файл в файл заголовка, который также необходим в исходном файле класса, что мне делать? Я приведу пример
header.h (файл)
#include <Windows.h>
#include "some_other_header.h"
class class_name
{
public:
LRESULT CALLBACK FUNC(HWND, UINT, WPARAM, LPARAM);
private:
}
source.cpp (файл)
#include "header.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)
Как вы знаете, LRESULT является частью библиотеки, и его не нужно включать в «source.cpp», потому что он включен в файл «header.h». Проблема в том, что если я включу «header.h» в любой другой файл, мне бы не пришлось включать ни то, ни другое, потому что он уже находится в «header.h», это немного сбивает с толку, это довольно сложно объяснить, но я хочу полностью избежать любые ошибки, которые это может привести.
Используйте Директива препроцессора #pragma once или аналогичный ...
Возможный дубликат Как правильно использовать файл заголовка в C++?





Это не обязательно. Директива #include дословно копирует содержимое файла вместо #include. Таким образом, любой файл, включенный в файл, будет включен. В вашем примере у вас есть Windows.h>, "some_other_header.h и header.h, все они включены в ваш файл .cpp (а также любой заголовок, включенный Windows.h и some_other_header.h).
Часто рекомендуется включать их в любом случае, чтобы вы не зависели от некоторых файлов заголовка 10 выше, но обычно он опускается в паре заголовок-источник. Копировать заголовки, если они нужны как для объявления, так и для определения функции, нереально.
С другой стороны, вы должны добавить защиту заголовка из-за механизма, упомянутого выше. Без защиты вы можете столкнуться с проблемами двойного определения, когда заголовок включается из разных источников. Если вы собираетесь использовать этот заголовок более чем в одном файле, они необходимы, а в противном случае - хорошая практика.
Стандартная защита жатки выглядит так:
#ifndef HEADER_H //or any other name, typically it's filename or filename with path
#define HEADER_H
//your header here
#endif
Большинство компиляторов также поддерживают нестандартную директиву pragma.
#pragma once
//your header here
Безопасно не включать заголовок в файл .cpp, если он включен где-то еще. #include - это почти то же самое, что просто вырезать и вставить содержимое файла туда, где находится директива, поэтому после предварительной обработки вы получаете один огромный файл, содержащий все, что было включено. Пока он попадает туда раньше всего, что использует его содержимое, все в порядке.
Я бы посоветовал, однако, что, если вы используете материал из windows.h каким-либо образом, независимо от header.h, вы все равно включаете заголовок, чтобы вы точно знали, что всегда в конечном итоге включит нужный заголовок. Любой уважающий себя файл заголовка библиотеки, включая windows.h, безопасен для #include дважды - он не допускает повторного включения в одну и ту же единицу трансляции, будь то через include guards или через #pragma once. И если header.h однажды может измениться, чтобы не нуждаться в windows.h, вы хотите иметь возможность внести это изменение, не вызывая кучу ошибок.
Хорошая практика - также сохранить все файлы самодостаточный. То есть каждый файл должен явно включать заголовки, объявляющие каждый символ, который используется в этом файле. Хранение полного списка включений в каждом файле может показаться пустой тратой времени, однако несоблюдение этого правила приводит к хрупкой кодовой базе, когда изменение включений в одном файле может вызвать цунами неработающих объявлений на протяжении всего проекта и значительные потери времени.
Вы хотите сказать, что я должен просто включать файлы по отдельности в каждый файл? Если да, то спасибо, это то, что я думал сделать.
Возможный дубликат stackoverflow.com/questions/35762699/…