programing

배열 첨자 안에 "휘발성" 키워드가 나타나는 목적은 무엇입니까?

showcode 2023. 6. 14. 22:00
반응형

배열 첨자 안에 "휘발성" 키워드가 나타나는 목적은 무엇입니까?

cppreference를 검색하는 동안 다음과 같은 함수 매개 변수에서 이상한 유형의 배열을 보았습니다.

void f(double x[volatile], const double y[volatile]);

그래서, 그 목적은 무엇입니까?volatile배열 첨자 안에 키워드가 표시됩니까?그것은 무엇을 합니까?

volatile키워드는 함수 매개 변수의 배열 유형을 선언하는 데 사용됩니다.

여기서,double x[volatile]와 동등합니다.double * volatile x.

cpp 기본 설정은 다음과 같습니다.

함수 선언에서 키워드는 함수 매개 변수의 배열 유형을 선언하는 사용되는 대괄호 안에 나타날있습니다.배열 유형이 변환되는 포인터 유형을 한정합니다.다음 두 선언은 동일한 기능을 선언합니다.

void f(double x[volatile], const double y[volatile]);

void f(double * volatile x, const double * volatile y);

이 구문은 함수 매개 변수의 C 언어에서만 유효합니다.

일반적으로 이 C(및 C만 해당) 기능을 사용하면 배열 대괄호 안에 있는 모든 형식 한정자를 지정할 수 있습니다. 정확한 표준 따옴표는 다음과 같습니다.

매개 변수를 ''array of type''으로 선언하는 경우 ''alified pointer to type''으로 조정해야 합니다. 여기서 형식 한정자(있는 경우)는 배열 형식 파생의 및 내에서 지정된 것입니다.키워드인 경우static에도 표시됩니다.[그리고.]배열 유형 파생의 경우, 함수에 대한 각 호출에 대해, 해당 실제 인수의 값은 크기 식에 의해 지정된 최소 개수의 요소로 배열의 첫 번째 요소에 대한 액세스를 제공해야 합니다.

(C99, § 6.7.5.3, 7, 강조 추가)

이것은 이것이 단지 다음과 같은 것에 국한되지 않는다는 것을 의미합니다.volatile,그렇지만const그리고.restrict또한 허용됩니다(형식 한정자, § 6.7.31 참조).

이 해킹의 요점은 기본적으로 (어레이의 요소가 아닌) 매개 변수에 형식 한정자를 추가하고 선언을 위한 배열 구문을 유지할 수 있도록 하는 것입니다. 이 구문이 없으면 포인터로 쓸 수밖에 없습니다.AFAIK에는 동등한 포인터 구문이 없습니다.

다차원 배열에 대해 구문을 약간 덜 어색하게 만드는 것이 대부분인 것 같습니다. § 6.7.5.3 21을 인용합니다.

void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);

모두 동일하지만, 2와 3은 이것이 단순한 포인터가 아니라 배열을 의도한다는 것을 약간 더 잘 전달할 수 있으며, 여전히 어떤 장소에 두도록 허용합니다.restrict예선의

또한, 위에서 말한 것처럼, 다음과 같은 것을 가질 수 있는 방법은 없는 것 같습니다.

void f(double a[restrict static 3][5]);

는 ("이 " 한것정는해다인지수다를니합하당은에음다▁cor▁(also▁argument지▁(▁the▁that니"에 해당하는 인수를 지정합니다.a무슨 일이 있어도f"정규" 포인터 구문을 사용하는 최소 3개의 배열 중 첫 번째 배열인 "5배", ibidem)에 대한 비반복 포인터여야 합니다.

여전히, 저는 이 구문을 멀리할 것입니다. 매우 모호하고 거의 사용되지 않습니다. (어레이 매개 변수에 형식 한정자를 추가할 필요가 없다고 생각합니다. 다시 말하지만, 요소 유형이 아니라 매개 변수 자체입니다.restrict는 C++에 이식할 수 없는 유일한 사용 사례입니다(라이브러리를 작성하는 경우 일반적으로 관련이 있음).

언급URL : https://stackoverflow.com/questions/47377106/what-is-the-purpose-of-the-volatile-keyword-appearing-inside-an-array-subscrip

반응형