在浏览一些源代码时,我遇到了这样的函数:
void someFunction(char someArray[static 100])
{
// do something cool here
}
Run Code Online (Sandbox Code Playgroud)
通过一些实验,似乎其他限定符也可能出现在那里:
void someFunction(char someArray[const])
{
// do something cool here
}
Run Code Online (Sandbox Code Playgroud)
似乎只有[ ]在将数组声明为函数的参数时才允许使用限定符.这些怎么办?为什么功能参数不同?
所以我正在阅读一篇关于优化int块的排序的博客,其实现在c中.我走过这条线,我不明白:
void nibble_sort_bucket(uint64_t buf[static 1024]) {
Run Code Online (Sandbox Code Playgroud)
缓冲区基本上是要排序的数据,其中的每个int都有4位排序的块,所以它基本上用于基准测试.当我抬起ci中静态的用法时发现了两件事.
这些都没有意义.有人可以解释为什么你会在一个数字前写静态,这有什么作用?
如here,here和here以这种方式定义的函数(在c99 或更新版本中)
void func(int ptr[static 1]){
//do something with ptr, knowing that ptr != NULL
}
Run Code Online (Sandbox Code Playgroud)
有一个ptr指向 int 类型指针的参数 ( ) 并且编译器可以假定该函数永远不会以 null 作为参数被调用。(例如,编译器可以优化空指针检查,或者在使用空指针调用 func 时发出警告 - 是的,我知道,编译器不需要执行任何操作......)
C17 第6.7.6.3节函数声明符(包括原型)第 7 段说:
将参数声明为“类型数组”应调整为“指向类型的限定指针”,其中类型限定符(如果有)是在数组类型派生的 [ 和 ] 中指定的那些。如果关键字static也出现在数组类型派生的 [ 和 ] 中,那么对于函数的每次调用,相应实参的值应提供对数组的第一个元素的访问,该元素至少与指定的元素一样多由大小表达式。
在上述定义的情况下,值ptr必须提供对至少具有元素的数组的第一个元素的访问1。因此很明显,该参数永远不能为空。
我在徘徊的是,使用不属于数组的 int 的地址调用这样的函数是否有效。例如,这是(根据func上面的定义)技术上有效还是未定义的行为:
int var = 5;
func(&var);
Run Code Online (Sandbox Code Playgroud)
我知道这实际上永远不会成为问题,因为我所知道的编译器没有区分指向 int 数组成员的指针和指向局部 int …