gpt4 book ai didi

arrays - C中参数数组类型中的 “static”是什么意思?

转载 作者:行者123 更新时间:2023-12-02 21:16:15 24 4
gpt4 key购买 nike

我看到了以下一些复杂的函数定义。

void foo(double A[static 10]) {
double B[10];
}

它是有效的 C 和 C++ 代码吗?它是 C99 还是 C++ 标准引入的新语法?它的目的是什么?我应该什么时候使用它?这有什么必要?

最佳答案

这个 C99 符号,void foo(double A[static 10]),意味着函数可以假定 A 指向 10 个有效参数(来自 *AA[9])。该符号使程序提供更多信息,帮助编译器优化为函数 foo 生成的代码,并检查它是否在每个调用站点被正确调用。

在引入符号的 C99 标准中,这包含在条款 6.7.5.2 和 6.7.5.3:7 中。

“… If the keyword static also appears within the [ and ] of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression”


一个常见的用法是 f(int p[static 1]),它或多或少等同于其他语言中的引用(与指针相反)的概念语言。如果声明了这样的函数并在调用站点传递了一个空指针,Clang 会发出警告(因为该符号明确表示 p 不会是 NULL)。然而,我上次尝试时,Clang 没有针对 f(&a + 1) 发出警告,这很遗憾(但编译器不必发出所有警告。发出 一些 警告已经很好了):

#include <stdio.h>

void f(int p[static 1])
{
printf("%d\n", *p);
}

int main(){
int a = 0;
f(&a + 1);
f(0);
f(&a);
}

Clang 对第二个调用发出警告,但不幸的是对第一个调用没有警告:

$ clang t.ct.c:11:3: warning: null passed to a callee which requires a non-null argument      [-Wnonnull]  f(0);  ^ ~t.c:3:12: note: callee declares array parameter as static herevoid f(int p[static 1])           ^~~~~~~~~~~1 warning generated.

语法可能看起来有点奇怪,但 C99 标准化委员会显然决定在不会引起歧义的地方重用预先存在的 static 关键字,以避免引入新的关键字(可能会破坏现有程序)。

关于arrays - C中参数数组类型中的 “static”是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30453010/

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