배열 첨자 안에 "휘발성" 키워드가 나타나는 목적은 무엇입니까?
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
'programing' 카테고리의 다른 글
ASP.NET MVC 작업에서 HTTP 404 응답을 보내는 올바른 방법은 무엇입니까? (0) | 2023.06.14 |
---|---|
"쓰기 작업 실패: 계산된 속성 "포스트"가 읽기 전용입니다." (0) | 2023.06.14 |
Oracle PL/SQL을 위한 유닛 테스트 프레임워크? (0) | 2023.06.14 |
XML 패키지를 사용하여 html 테이블을 R 데이터 프레임으로 스크랩 (0) | 2023.06.14 |
FUN 내부의 응용프로그램 인덱스 이름에 액세스합니다. (0) | 2023.06.14 |