2010-06-19 2 views
0

Я новичок, и я стараюсь улучшить себя в хорошей практике и дизайне, поэтому рассмотрим это, прежде чем читать следующее.DEFINE Macro работает на всех платформах?

Я создаю одноэлементный класс, и у меня довольно много статических членов. Вместо того, чтобы звонить членам каждый раз, как это ...

THECLASS::member 

Я думал об использовании макроса определения, чтобы сделать его короче.

#define(THECLASS::member, shortMember); 

Так что мой вопрос: будет ли это вредно для перекрестных платформ или перекрестных компиляторов.

+4

В дополнение к комментариям, приведенным ниже, вы должны рассмотреть [не использовать шаблон singleton вообще] (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you- никогда не было, так как-1995 /). –

ответ

7

Ваше определение не будет работать нигде, на самом деле. Оно должно быть:

#define shortMember THECLASS::member 

И хорошая практика будет не пытаться сохранить нажатия клавиш – читаемость является более важным, а кто-то читает код хочет видеть THECLASS :: член, не shortMember, потому что тогда он знает, где искать определение.

+3

+1 для читаемости важнее. Вы только набираете кусок кода один раз (образно), но его читают много раз, а не только вы. – ChrisF

+0

у вас есть shortMember и THECLASS :: member swapped. EDIT: Я вижу, вы исправили это. –

+0

Я думаю, что это был отличный момент. – numerical25

1

Если ваш класс состоит из всех статических методов, вы могли бы вместо того, чтобы объявить namespace с методами, а затем, когда вы хотите использовать методы в файле .cpp, включают в верхней части файла:

using namespace [your-namespace]; 

Просто не делайте этого в файле заголовка или вы будете загрязнять пространство имен всех других файлов, которые включают этот заголовок.

1

Скорее всего, но вы открываете конфликты пространства имен, которые, как предполагалось, должны были избегать в первую очередь, поэтому, вероятно, это не очень хорошая идея.

6

Вы должны использовать правильный синтаксис для определения макроса:

#define shortMember THECLASS::member 

Однако не делают этого.

  • Все макросы находятся в одном пространстве имен, и замена происходит повсюду, поэтому вы получаете огромную головную боль обслуживания.

  • Это вредит читаемости и понятности кода, потому что это делает его гораздо более трудным, где имена пришли и к чему они относятся

Хорошая практика в данном случае это прописать имя везде, где вы используете его.

0

Определить будет работать, но не определить, что вы написали в своем вопросе. Что-то вдоль линий:

class SingletonImpl { 
... 
SingletonImpl *getInstance() { return m_instance; } 
} 

#define SINGIMPL SingletonImpl::getInstance() 

, которые затем могут быть использованы как это:

SINGIMPL->whatever(); 

Однако имейте в виду, что макросы просто сделать замену текста и, следовательно, игнорировать такие вещи, как пространство имен.

0

Чтобы ответить на вопрос в своем названии, да, правильно написанная DEFINE будет работать на всех платформах. Однако, как утверждают другие, это не является хорошей идеей для вашей цели по причинам, указанным.

Смежные вопросы