#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 на что-то другое.