Это определенно возможно, хотя это невообразимо плохая практика - не включать охранников. Важно понимать, что на самом деле делает оператор #include: содержимое другого файла вставляется непосредственно в исходный файл перед его компиляцией. Защитный барьер предотвращает повторную вставку того же кода.
Включение файла вызывает ошибку только в том случае, если было бы неправильно вводить содержимое этого файла в том месте, где вы его включили. Например, вы можете объявлять (примечание: объявлять, а не определять) одну и ту же функцию (или класс) несколько раз в одном модуле компиляции. Если ваш заголовочный файл состоит только из объявлений, вам не нужно указывать защиту для включения.
IncludedFile.h
class SomeClassSomewhere;
void SomeExternalFunction(int x, char y);
main.cpp
#include "IncludedFile.h"
#include "IncludedFile.h"
#include "IncludedFile.h"
int main(int argc, char **argv)
{
return 0;
}
Несмотря на то, что объявление функции (или класса) несколько раз - это нормально, определять одну и ту же функцию (или класс) несколько раз. Если для функции существует два или более определений, компоновщик не знает, какое из них выбрать, и отказывается с ошибкой «множественные символы».
В C ++ заголовочные файлы очень часто включают определения классов. Защита от включения предотвращает вставку файла #included во второй файл во второй раз, что означает, что ваши определения появятся только один раз в скомпилированном коде, и компоновщик не будет сбит с толку.
Вместо того, чтобы пытаться выяснить, когда вам нужно их использовать, а когда нет, просто всегда используйте включенные охранники. Избегать макросов большую часть времени - хорошая идея; это одна ситуация, когда они не злые, и их использование здесь не опасно.