В c , когда я часто использую многоуровневый указатель, хороший ли способ использовать typedef для его упрощения?

#c #typedef

#c #typedef

Вопрос:

В c , когда я часто использую многоуровневый указатель, хороший ли способ использовать typedef для его упрощения?

Комментарии:

1. Просто чтобы ответить более достоверно: что для вас является «многоуровневым» указателем?

Ответ №1:

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

Давайте констатируем, что у вас есть:

 class Foo
{
  public:
    Foo(const myotherlib::x509::certificateamp; cert);

  private:

    myotherlib::x509::certificate m_cert;
}
  

Неплохо бы немного ввести typedef:

 class Foo
{
  public:

    typedef myotherlib::x509::certificate cert_type;

    Foo(const cert_typeamp; cert);

  private:

    cert_type m_cert;
}
  

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

И, чтобы ответить более полно, то же правило может применяться к «многоуровневым» указателям: если вы действительно пишете Foo*** повсюду, это действительно может быть хорошей идеей сделать вещи более читаемыми, и typedef это хороший инструмент для этого.

Если однажды вы решите заменить свой Foo*** класс с такой же семантикой, изменение будет тривиальным не только в вашем коде, но и в любом клиентском коде, который также использует ваш.

Комментарии:

1. Downvoter, не хотите уточнить? Я никогда не голосовал за месть (как показывает мой профиль), поэтому, пожалуйста, продолжайте.

2. Я предполагаю, что даунвотер думает, что вы не ответили на вопрос: Вы объясняете, что определение типов в пространствах имен может быть полезным, но вопрос касается многоуровневых указателей: Т.е. typedef Foo ** FooPtrs;

3. @Andre: да, возможно, это так. Однако в моем ответе действительно говорится о многоуровневых указателях, просто не сразу. На мой взгляд, такое использование typedef имеет еще больше смысла для длинных имен типов, вот почему я выбрал этот пример первым. Возможно, это действительно был неправильный выбор. Однако не уверен, что это заслуживает понижения (не похоже, что мой ответ изначально неверен). Спасибо за отзыв.

Ответ №2:

Да, всегда полезно использовать typedef . Например,

 typedef int* intp;
typedef int** intpp;
  

Теперь, если ваш код действительно организован, вы можете изменить simply typedef на использование вашего пользовательского или любого другого интеллектуального указателя. например

 typedef auto_ptr<int> intp;
  

Это может быть хорошим способом для отладки.

Комментарии:

1. Просто не забывайте использовать разные typedef для разных указателей. То есть измените второй intp на что-то другое.