c-指向const数据的const指针(gcc-重复的'const'声明说明符)

时间:2019-02-01 10:37:47

标签: c pointers const

我正在对微控制器上的模块进行编程,以使其与EEPROM接口以从那里接收一些用户数据。由于您无法轻易覆盖EEPROM,因此我想返回一个指向const数据的const指针。

现在我的函数原型如下:

const struct userData const* getEEPROMDataAtIndex(uint32_t uidIndex)

而gcc告诉我duplicate 'const' declaration specifier [-Wduplicate-decl-specifier]。我使用的每个const都不应该有不同的效果吗?一个使指向的数据不可变,另一个使接收的指针不被拖延?

4 个答案:

答案 0 :(得分:5)

您已经两次声明了您的struct const。由于将指针const设为返回类型没有意义,因此只需删除const声明之一即可。如果要使指针const(在返回类型中实际上没有意义),则可以将const放在星号之后。

答案 1 :(得分:4)

您似乎有一些小姐了解有关常量,例如。

#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

希望这会有所帮助。

答案 2 :(得分:-2)

const struct userData *const => const struct userData * const foo(void); void bar(void) { const struct userData *const ptr_to_something = foo(); /* some code */ }

它可以在自动变量初始化期间使用:

{{1}}

答案 3 :(得分:-3)

我建议使用typdef来定义您的返回数据类型。然后在函数声明中,只需要将返回类型声明为typedef名称。

例如...

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

我认为这会简化一些事情。 如果将'const struct'...交换为'struct const',会发生什么?