У меня есть следующие сомнения в использовании файлов заголовков.
1 - Включить защиту после комментариев
/* Copyright Note and licence information (multiple lines) */
#ifndef FOO_H
#define FOO_H
// Header file contents
#endif
Трава Саттер говорит в своей книге "Стандарты кодирования на C++", что такой код, как выше, проблематичен. Он говорит, что операторы "#ifndef" должны появиться в первой строке файла заголовка. Я не считаю это убедительным. За этим следуют вы, парни/галы, в заголовочных файлах?
2 - Использование пространств имен в файлах заголовков
#ifndef FOO_H
#define FOO_H
namespace FooNameSpace{
// Header file contents
}
#endif
Является ли приведенный выше код правильной практикой? Я имею в виду, вы используете пространства имен в заголовочных файлах? Я знаю, почему импорт пространства имен в заголовочном файле бессмысленен, но как насчет объявления вроде выше?
Если приведенный выше метод является правильным, как вы выполняете "форвардную декларацию" класса, который находится в другом пространстве имен? Это как
#ifndef FOO_H
#define FOO_H
namespace AnotherNameSpace{
class AnotherFoo; // forward declaration
}
namespace FooNameSpace{
// Use AnotherFoo here
}
#endif
"Прямое объявление" - единственный способ избежать "циклической зависимости", правильно?