C99에서 이상한 배열 크기[*]와 [정적]는 얼마입니까?
C99 및 C11에서는 다음과 같은 기능 프로토타입이 유효합니다.
void foo(int a[const *]);
void bar(int a[static volatile 10]);
그 이상한 구독의 목적은 무엇입니까?*
,static
, 그리고 CV 예선?
정적으로 입력된 배열과 가변 길이 배열을 구분하는 데 도움이 됩니까?아니면 그냥 통사당일까요?
매개 변수 배열 선언기에서 static
void f(int a[static 10]);
static
여기에 매개 변수가 다음과 같이 표시됩니다.a
에 대한 포인터입니다.int
그러나 어레이 오브제(여기서a
는 그것의 첫번째 요소에 대한 포인터)를 적어도 가지고 있습니다.10
요소들.
컴파일러는 다음과 같이 추정할 권리가 있습니다.f
논쟁은 그렇지 않습니다.NULL
따라서 최적화 작업을 수행할 수 있습니다.gcc
현재 최적화를 수행하지 않습니다(소스):
"파라미터 배열 선언자에서 static이 제공하는 정보는 최적화에 사용되지 않습니다.앞으로 프리페칭 작업과 함께 사용하는 것이 타당할 수도 있습니다."
매개 변수 배열 선언자에서 한정자
void g(int a[cvr 10]);
안에서.g
a
에 대한 cvr 포인터입니다.int
(cvr은const
,volatile
아니면restrict
한정자).예를 들어 다음과 같이const
라는 뜻입니다.a
가const
포인터로 가리키다int
(즉, 활자int * const
).
따라서 매개 변수 선언:
T param[cvr e]
는 매개 변수 선언과 같습니다.
T * cvr param
* 매개 변수 배열 선언기에서
void h(int a[*]);
그[*]
함수 선언의 형식 배열 매개 변수 선언(함수 정의의 일부가 아님)은 형식 배열이 가변 길이 배열임을 나타냅니다.
언급URL : https://stackoverflow.com/questions/17559631/what-are-those-strange-array-sizes-and-static-in-c99
'source' 카테고리의 다른 글
문자열이 NULL 또는 공백이 아닌지 확인합니다. (0) | 2023.10.06 |
---|---|
malloc에서는 왜 brk를 사용합니까?왜 그냥 mmap을 사용하지 않습니까? (0) | 2023.10.06 |
$odd 또는 $even 속성으로 필터링-반복할 수 있습니까? (0) | 2023.10.01 |
=*의 의미는 무엇입니까? (0) | 2023.10.01 |
Vim [컴파일 및] 실행 바로 가기 (0) | 2023.10.01 |