DEFINE Macro работает на всех платформах? - PullRequest
0 голосов
/ 19 июня 2010

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

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

THECLASS::member

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

#define(THECLASS::member, shortMember);

Итак, мой вопрос, будет ли это больно для кросс-платформенных или кросс-компиляторов.

Ответы [ 6 ]

7 голосов
/ 19 июня 2010

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

#define shortMember THECLASS::member

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

6 голосов
/ 19 июня 2010

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

#define shortMember THECLASS::member

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

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

  • Это ухудшает читабельность и понятность кода, поскольку значительно усложняет, откуда приходят имена и к чему они относятся

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

1 голос
/ 19 июня 2010

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

1 голос
/ 19 июня 2010

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

using namespace [your-namespace];

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

0 голосов
/ 19 июня 2010

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

0 голосов
/ 19 июня 2010

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

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

#define SINGIMPL SingletonImpl::getInstance()

, которое затем можно использовать следующим образом:

SINGIMPL->whatever();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...