“char s [static 10]”과 같은 함수의 배열 매개 변수에서 static 키워드의 목적은 무엇입니까?


144

일부 소스 코드를 탐색하는 동안 다음과 같은 기능을 발견했습니다.

void someFunction(char someArray[static 100])
{
    // do something cool here
}

몇 가지 실험을 통해 다른 한정자가 나타날 수도 있습니다.

void someFunction(char someArray[const])
{
    // do something cool here
}

한정자는 [ ]배열이 함수의 매개 변수로 선언 된 경우에만 허용되는 것으로 보입니다 . 이것들은 무엇을 하는가? 기능 매개 변수가 다른 이유는 무엇입니까?

답변:


127

첫 번째 선언은 컴파일러 알 수 someArray있다 적어도 100 개 요소 오래. 최적화에 사용할 수 있습니다. 예를 들어, 이는 someArray결코 그렇지 않음을 의미합니다 NULL.

C 표준에서는 함수 호출이 이러한 요구 사항을 충족하지 않는 경우 (즉, 정의되지 않은 자동 동작) 컴파일러에서 진단 할 필요가 없습니다.

두 번째 선언은 단순히 요소가 someArray아닌 someArray요소를 const로 선언 합니다. 즉, 쓸 수 없습니다 someArray=someOtherArray. 이 매개 변수가있는 것처럼 동일합니다 char * const someArray.

이 구문은 []함수 매개 변수 목록에서 배열 선언자 의 가장 안쪽에서만 사용할 수 있습니다 . 다른 상황에서는 의미가 없습니다.

위의 두 경우를 모두 다루는 표준 텍스트는 C11 6.7.6.3/7(C99의 6.7.5.3/7)에 있습니다.

매개 변수를``타입의 배열 ''로 선언하는 경우 ''유형 포인터 유형 ''으로 조정되어야하며, 여기서 유형 규정 자 (있는 경우)는 배열 유형 도출 []배열 유형 내에 지정됩니다 . static 키워드 가 배열 유형 파생 []배열 유형 내에서도 나타나는 경우, 함수를 호출 할 때마다 해당 실제 인수의 값은 적어도 지정된 수의 요소를 가진 배열의 첫 번째 요소에 대한 액세스를 제공해야합니다. 크기 표현.


35
이 주제에 대해 : NULL 포인터를 허용하지 않는 함수의 서명 int foo(struct bar [static 1]);대신 사용 하는 것이 바람직하다고 생각되는지 궁금합니다 int foo(struct bar *);. (gcc는 컴파일러가 경고를 줄 수 있도록 이러한 함수를 표시하는 대체 비표준 구문을 가지고 있음을 알고 있습니다.)
R .. GitHub 중지 도움말 ICE

2
방금 gcc와 clang을 확인했으며 someArray가 0과 비교하도록 요청할 때 항상 null이 아닌 것으로 가정하지 않습니다. 또한 C99에서 정확한 절을 찾는 데 어려움을 겪고 있습니다. 6.7.5.3-21에는 의도 된 의미를 언급 한 메모가 있습니다. 우리가 이것에 의지 할 수 있을지 의문입니다. 또한이 모든 것이 함수 시그니처의 일부가 아니므로이를 통해 시행 할 것이 많지 않습니다.
Nordic Mainframe

5
그 링크는 썩어 버린 것 같습니다. 이것이 가리키는 것입니까? pic.dhe.ibm.com/infocenter/zos/v1r12/…
Ross Aiken

13
@NordicMainframe : 시간이 지났지 만 매개 변수 선언이 clang있는 함수에 알려진 NULL 인수를 전달하려고 하면 현재 버전이 올바르게 경고합니다 [static 1].
dreamlax

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功if (!someArray) { somecode... }을 (를) 제거 할 수 있습니다.
MM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.