2013-05-09 3 views
4

Эта вещь была частично затронута в другом вопросе о SO, но несколько небрежно, поскольку это был не главный вопрос. Поскольку мое замешательство все еще сохраняется, я ставил его в отдельный вопрос.Почему {typedef int * PTR; const PTR p = #} не эквивалентен «const int * p = & num», а «int * const p = & num»?

Почему следующие два утверждения эквивалентны int* const p=&num, а не const int* p=&num, когда последнее кажется более логичным и интуитивно понятным? Каковы строгие причины такого поведения typedef?

typedef int* PTR; 
const PTR p=# 

И, наконец, в этом вопросе один член отмечает, что это плохая практика, чтобы использовать typedef ред указатели. Но я видел, что он широко используется во многих книгах и на веб-сайтах, и это кажется удобной задачей. Это делает код более понятным. Итак, каково окончательное слово? Следует ли как можно больше избегать typedef указателей?

Edit: А что будет правильный синтаксисом для этого typedef заявления, если мы хотим следующее:

const int* const p=# 

Edit: я нечаянно забыл спросить важную вещь. Каков правильный синтаксис с использованием инструкции typedef для следующего?

const int* p=#  //instead of the int* const p=&num that we got 

ответ

4

Вообще,

const TYPE var = ini; 

объявляет const переменная var типа TYPE. Так

const PTR p=# 

объявляет const переменная p типа PTR, инициализирован с адресом num.

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

Если вы хотите получить

const int* const p=# 

с a typedef, вы должны typedef что-то в том числе const int, например

typedef const int *CI_ptr; 

, а затем вы можете написать

const CI_ptr p = # 

(но не, это некрасиво).

И

const int *p = # 

вы можете написать

CI_ptr p = # 

И, наконец, в этом вопросе один член отмечает, что это плохая практика, чтобы использовать typedef ред pointers.But я видел он широко используется во многих книгах и веб-сайтах и ​​кажется удобным для этого, что делает код более понятным.

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

typedef struct list_node { 
    int value; 
    struct list_node next; 
} *node; 

например, одно, к сожалению, распространенное злоупотребление. Когда вы читаете тип node, вы не подозреваете, что это указатель. По крайней мере, напечатайте его до node_ptr. Но тогда, почему typedef указатель на всех, typedef Строка и использование node* короче и яснее.

Так что же это за слово? Следует ли как можно больше избегать typedef указателей?

На это нет высшей власти, поэтому в основном это решение. Следуйте стилю кодирования в компании/проекте, если он есть, используйте свое мнение, если вы сами кодируете.

+0

Я забыл добавить 2 важных момента. Я добавил их как ** Редактирование **. Можете ли вы любезно изучить их? –

+0

Одной из причин появления typedefs типов указателей является то, что вы используете их как непрозрачные объекты вне API. Итак, 'struct foo_magic_structure; typdef my_magic_structure * foo_handle; ', а затем ваш API ссылается на' foo_handle' всюду. Конечно, это относится гораздо больше к C, чем к C++. –

0

Это одна из проблем использования typedef для типов указателей объекта.

Квалификатор (const, volatile) никогда не проникает в typedef.

Это одна из причин, по которой некоторые стандарты кодирования запрещают использование typedef для типов указателей объектов.

+0

Можете ли вы любезно изучить мой ** Редактировать **, который я только что добавил к моему вопросу. –

+0

Я добавил 2 редактирования. –

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