Объявления классов обычно выглядят так:
#ifndef MY_CLASS_20141116
#define MY_CLASS_20141116
...
class MyClass
{
...
}
#endif
Мой вопрос: почему бы не использовать имя класса вместо переопределения нового идентификатора:
#ifndef MyClass
...
class MyClass
{
}
#endif
Я предполагаю, что это связано с конфликтами идентификаторов (один и тот же идентификатор может появляться дважды) или использованием пространства имен (я не знаю, может ли полный идентификатор, такой как std :: array, использоваться в директиве #ifndef).
Было бы здорово более подробное объяснение.
Также можно использовать второй тест при использовании пространства имен?
#ifndef A::MyClass //not compile, any equivalent?
namespace A
{
...
class MyClass
{
}
}
#endif
Первый пример:
#ifndef MyClass
...
class MyClass
{
}
#endif
Это не может работать, потому что MyClass никогда не определяется для препроцессора. Все директивы начинаются с #
являются директивами препроцессора и являются единственными, которые понимает препроцессор. class MyClass
не имеет особого значения для препроцессора и не будет создавать определение препроцессора.
Чтобы это работало, вы должны определить MyClass
: #define MyClass
,
Однако, делая это, препроцессор заменит class MyClass
от class
, который не скомпилируется.
Теперь второй пример:
#ifndef A::MyClass //not compile, any equivalent?
A::MyClass
это не токен препроцессора, это несколько токенов. #define SOMETHING
работать только с одним токеном (который состоит из символов a-zA-Z_0-9
).