c - константный указатель на константные данные (gcc - дубликат спецификатора объявления const) - PullRequest
0 голосов
/ 01 февраля 2019

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

Теперь мой прототип функции выглядит следующим образом:

const struct userData const* getEEPROMDataAtIndex(uint32_t uidIndex)

пока gcc говорит мне duplicate 'const' declaration specifier [-Wduplicate-decl-specifier].Разве каждый const, который я использую, не должен иметь другой эффект?Один, чтобы сделать неизменяемыми данные, другой, чтобы полученный указатель не был повторно обработан?

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

const struct userData const* => const struct userData *const

Может использоваться при инициализации автоматической переменной:

const struct userData * const foo(void);

void bar(void)
{
    const struct userData *const ptr_to_something = foo();

    /* some code */ 
}
0 голосов
/ 01 февраля 2019

Вы объявили свою структуру const дважды.Поскольку указатель const в возвращаемом типе не имеет смысла, просто удалите одно из объявлений const.Если вы хотите сделать указатель const (что на самом деле не имеет смысла в возвращаемом типе), вы должны поставить const после звездочки.

0 голосов
/ 01 февраля 2019

У вас, кажется, есть некоторые неправильные представления о const, например.

#include <stdio.h>
int main()
{
    int a=123, b=456;
    const int *pa = &a;
    pa = &b;    //legal 
    *pa = 4;    //illegal
    printf("a=%d\n", a);
    return 0;
}

gcc выдаст ошибку, говорящую, что

x.c: In function ‘main’:
x.c:8:9: error: assignment of read-only location ‘*pa’
     *pa = 4;
         ^

для вашей цели, если я правильно понимаю, выследует определить функцию как

const struct userData * getEEPROMDataAtIndex(uint32_t uidIndex);
//this const declare the returned pointer point to something cannot be changed

, а затем, когда вы инициируете свой константный указатель, вызывая эту функцию

const struct userData * const myp = getEEPROMDataAtIndex(index);
//                       ^ this declare the pointer itself (myp) cannot be changed

Надеюсь, это поможет.

0 голосов
/ 01 февраля 2019

Я предлагаю использовать typdef для определения типа вашего возвращаемого типа данных.Тогда в объявлении функции вам нужно только объявить тип возвращаемого значения как имя typedef.

Например ...

typedef struct USER_DATA
{
....
...
};

Я думаю, это немного упростит ситуацию.что произойдет, если вы поменяете 'const struct' ... на 'struct const'?

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