我正在对微控制器上的模块进行编程,以使其与EEPROM接口以从那里接收一些用户数据。由于您无法轻易覆盖EEPROM,因此我想返回一个指向const
数据的const
指针。
现在我的函数原型如下:
const struct userData const* getEEPROMDataAtIndex(uint32_t uidIndex)
而gcc告诉我duplicate 'const' declaration specifier [-Wduplicate-decl-specifier]
。我使用的每个const都不应该有不同的效果吗?一个使指向的数据不可变,另一个使接收的指针不被拖延?
答案 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
',会发生什么?