#ifndef зачем использовать другое имя, кроме имени класса?

Объявления классов обычно выглядят так:

#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

0

Решение

Первый пример:

#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).

2

Другие решения


По вопросам рекламы [email protected]