gpt4 book ai didi

那个函数参数真的可以是指向常量的指针吗?

转载 作者:行者123 更新时间:2023-12-03 17:10:14 25 4
gpt4 key购买 nike

在以下 C 程序中,函数 f , g , 和 h本质上是相同的,但是 clang-tidy 说参数 p可以是指向常量的指针 gh (但不在 f 中)。我的理解是p在它们中的任何一个中都不能是指向常量的指针。那是假阳性吗?

struct S { int *p; };

extern void x(struct S *s);

void f(int *p)
{
struct S s;
s.p = p;
x(&s);
}

void g(int *p)
{
struct S s = { .p = p };
x(&s);
}

void h(int *p)
{
struct S s = { p };
x(&s);
}

int main()
{
int a = 0;
f(&a);
g(&a);
h(&a);
}
来自 clang-tidy 的输出:
$ clang-tidy --checks=* a.c
Error while trying to load a compilation database:
Could not auto-detect compilation database for file "a.c"
No compilation database found in /home/wolfram or any parent directory
fixed-compilation-database: Error while opening fixed database: No such file or directory
json-compilation-database: Error while opening JSON database: No such file or directory
Running without flags.
2 warnings generated.
/home/wolfram/a.c:14:13: warning: pointer parameter 'p' can be pointer to const [readability-non-const-parameter]
void g(int *p)
^
const
/home/wolfram/a.c:20:13: warning: pointer parameter 'p' can be pointer to const [readability-non-const-parameter]
void h(int *p)
^
const
尝试使用 clang-tidy 版本 10 和 11。
以下可能是相关的: https://bugs.llvm.org/show_bug.cgi?id=41393

最佳答案

该工具被窃听。此警告的意图可能是强制执行“常量正确性”,这仅在函数内部实际取消引用指针时才重要。您不会取消引用指针。
但更重要的是,C 语言需要这样做来进行简单的指针分配(6.5.1.6.1),强调我的:

  • the left operand has atomic, qualified, or unqualified pointer type, and (consideringthe type the left operand would have after lvalue conversion) both operands arepointers to qualified or unqualified versions of compatible types, and the type pointedto by the left has all the qualifiers of the type pointed to by the right;

制作指针参数 const会转 s.p = p;并且类似于约束违规 - invalid C. 初始化规则也遵循简单赋值规则,因此各种函数的行为相同。

关于那个函数参数真的可以是指向常量的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64908762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com