Вот объяснение того, что это означает 6.7.6.3/7:
Если ключевое слово static
также присутствует в пределах [
и ]
деривации типа массива, тодля каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, по крайней мере, с таким количеством элементов, как указано в выражении размера.
Это не совсемПонятно, что это значит.Я запустил следующий пример:
main.c
#include "func.h"
int main(void){
char test[4] = "123";
printf("%c\n", test_func(2, test));
}
И 2 различных реализации test_func
:
- статическая версия
func.h
char test_func(size_t idx, const char[const static 4]);
func.c
char test_func(size_t idx, const char arr[const static 4]){
return arr[idx];
}
нестатическая версия
func.h
char test_func(size_t idx, const char[const 4]);
func.c
char test_func(size_t idx, const char arr[const 4]){
return arr[idx];
}
Я проверил код сборки, скомпилированный с gcc 7.4.0 -O3
функции в обоих случаях, и она оказалась полностью идентичной:
Разборка функций
(gdb) disas main
sub rsp,0x18
mov edi,0x2
lea rsi,[rsp+0x4]
mov DWORD PTR [rsp+0x4],0x333231
mov rax,QWORD PTR fs:0x28
mov QWORD PTR [rsp+0x8],rax
xor eax,eax
call 0x740 <test_func>
[...]
(gdb) disas test_func
movzx eax,BYTE PTR [rsi+rdi*1]
ret
Можете ли вы привести пример, в котором ключевое слово static дает некоторые преимущества (илиесть ли вообще различия) по сравнению с нестатическим аналогом?