指向常量数据的c-const指针(gcc-duplicate';const';声明说明符)

指向常量数据的c-const指针(gcc-duplicate';const';声明说明符),c,pointers,constants,C,Pointers,Constants,我正在一个微型计算器上编程一个模块,用来连接它的EEPROM,从那里接收一些用户数据。由于您无法轻松覆盖EEPROM,因此我想返回指向const数据的const指针 现在,我的函数原型如下所示: const struct userData const*geteepromdatatinex(uint32\u t uidIndex) 而gcc告诉我重复的'const'声明说明符[-wdupplicate decl说明符]。我使用的每个常量不应该有不同的效果吗?一种是使指向的数据不可变,另一种是使接收

我正在一个微型计算器上编程一个模块,用来连接它的EEPROM,从那里接收一些用户数据。由于您无法轻松覆盖EEPROM,因此我想返回指向
const
数据的
const
指针

现在,我的函数原型如下所示:


const struct userData const*geteepromdatatinex(uint32\u t uidIndex)


而gcc告诉我
重复的'const'声明说明符[-wdupplicate decl说明符]
。我使用的每个常量不应该有不同的效果吗?一种是使指向的数据不可变,另一种是使接收到的指针不重新格式化?

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

例如

typedef struct USER_DATA
{
....
...
};
我认为这会使事情简化一点。
如果交换“
const struct
”,会发生什么情况。。。到“
struct const
”?

您已经声明了两次struct 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;
}
出于您的目的,如果我理解正确,您应该将函数定义为

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

希望这有帮助。

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 */ 
}

当我使用
const-struct-userData*const-geteepromdatatinex(uint32\u t uidIndex)
时,函数返回类型[-Wignored限定符]会忽略类型限定符作为警告。在输出中,
^~~~~
-箭头指向第一个常量,因此现在它将只是一个cont指针,后面有数据,不是吗?C中没有常量值;因此<代码>int const foo(无效)
intfoo(void)相同。如果将
int
替换为
const-struct-userdata*
更改为
struct-const-uid\u-t*const-getpersiteduidindex(uint32\u-t-uidIndex),则这一点不会改变未编译,并给出
预期值'{'在'const'之前
。我同意以后使用
typedef
,但为了简单起见,这里省略了它。
typedef
ing与这个问题无关,所以它只是不增加任何内容。好的,我明白了。非常感谢!但对我来说,这意味着调用方负责创建指针const,这是我希望通过自动返回函数的类型…这意味着我无法确保返回的指针是指向接口级别上常量数据的常量(返回类型)?您返回了一个指向该函数外部世界的值(指针),并将其分配给第二个变量(另一个指针),如果第二个变量是可修改的,我认为你不能控制它,它超出了范围。@PaulWürtz我不认为要求分配给指针是常量有什么用。指向的结构仍然是常量,如果你想修改结构,你必须做一些粗略的指针转换。呜呼,我现在可以了我觉得需要补充的是,返回常量指针的函数declare是信息性的,不是强制性的,如何使用该指针取决于调用者。答案中的“=”后面有一个奇怪的不可打印字符,可能是你的答案太“干”了吧?(我没有DV^)我不知道投票结果如何,但你认为OP在声明函数时,
const struct userData*const
会做什么?函数返回值。
const
只影响左值,它表示对象不会更改。例如,如果你有
const int x=4;
,这意味着
x
不会更改。但函数只返回一个值,如4。值只是一个值,而不是可以更改的对象。因此
const
对其没有影响。根据C 2018 6.7.3 5,“与限定类型关联的属性仅对左值表达式有意义。”@EricPostpischil
const struct userData*const foo()
试试cdecl.org,再看看我的答案。有什么解释吗?复仇还是糟糕的一天?OP的问题是关于声明函数的。对象的声明是不相关的。cdecl.org是不相关的;类型名义上是const限定的,这是毫无争议的。只是限定符对于函数来说毫无意义离子声明。
const struct userData * const foo(void);

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

    /* some code */ 
}