Несколько const в одном объявлении переменной - PullRequest
3 голосов
/ 02 февраля 2012

Мой коллега немного сходит с ума от const в ANSI C, и я хотел бы знать, что вы, ребята, думаете об этом. Например, он пишет такие вещи:

const uint8* const pt_data

Я понимаю, куда он идет с этим, но для меня это затрудняет чтение и удобство сопровождения со всеми этими const везде.

Ответы [ 4 ]

9 голосов
/ 02 февраля 2012

Это указатель const, указывающий на const данные.

  • Первый const предотвращает *pt_data = 10;
  • Второй const предотвращает pt_data = stuff;

Похоже, это может быть вполне законно.

6 голосов
/ 02 февраля 2012

const всегда относится к слову справа от него, за исключением случаев, когда оно находится в конце строки, где оно относится к самому элементу (на языках более высокого уровня)

const char* str; //This is a pointer to read-only char data
                 //Read as to (const char)* str;
                 //Thus :
                 //   *str = 'a';
                 //Is forbidden

char* const str; //This is a read-only pointer to a char data
                 //Read as char* (const str);
                 //Thus :
                 //   str = &a;
                 //Is forbidden

const char* const str; //This is a read-only pointer to read-only char data
                       //Read as (const char)* (const str);
                       //Thus :
                       //    str = &a
                       //  and
                       //    *str = 'a';
                       //Is forbidden

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

Ключевое слово

const отлично подходит для гарантии того, что что-то не будет изменено, а также говорит разработчику, что не следует. Например, int strlen(const char* str) говорит, что данные char в вашей строке не будут изменены.

5 голосов
/ 02 февраля 2012

Это постоянный указатель на постоянные данные.
это означает, что вы не можете изменить данные (чей адрес pt_data хранит), а также не можете изменить указатель (pt_data), чтобы он указывал на что-то другое (какой-то другой адрес).

Вероятно, ему это нужно.

2 голосов
/ 02 февраля 2012

Если вы начинаете с имени переменной и идете против часовой стрелки, pt_data - это указатель const на uint8, равный const.

См. Следующее грубое изображение ASCII:

  ,--------------------------------.
  |                                |
  |     ,------------------------. |
  |     |                        | |
  |     |   ,------------------. | |
  |     |   |                  | | |
  |     |   |    ,-----------. | | |
  |     |   |    |           | | | |
const uint8 * const pt_data; | | | |
        |   |    |     |     | | | |
        |   |    |     `-----' | | |
        |   |    |             | | |
        |   |    `-------------' | |
        |   |                    | |
        |   `--------------------' |
        |                          |
        `--------------------------'

С тех пор, как я видел эту схему в старой книге C много лет назад, она помогла мне понять сложные декларации.

...