Apa tujuan dari kata kunci "volatile" yang muncul di dalam subskrip array?

rsp 11/19/2017. 2 answers, 1.615 views
c arrays volatile function-parameter

Sementara saya browsing cppreference, saya melihat array tipe aneh dalam parameter fungsi seperti ini:

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

Jadi, Apa tujuan kata kunci yang volatile muncul di dalam subskrip array? Apa yang dilakukannya

2 Answers


rsp 11/23/2017.

Kata kunci yang volatile digunakan untuk mendeklarasikan tipe array dari parameter fungsi.

Di sini, double x[volatile] setara dengan double * volatile x .

Aturannya mengatakan:

Dalam deklarasi fungsi, kata kunci volatile mungkin muncul di dalam tanda kurung siku yang digunakan untuk mendeklarasikan tipe array dari parameter fungsi. Ini memenuhi syarat tipe pointer dimana tipe array diubah. Dua deklarasi berikut ini menyatakan fungsi yang sama:

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

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

Sintaks ini hanya berlaku dalam bahasa C dalam parameter fungsi.


Matteo Italia 11/20/2017.

Secara umum, fitur C (and C only!) Ini memungkinkan untuk menentukan tipe kualifikasi apapun di dalam kurung array; kutipan standar yang tepat adalah:

Sebuah deklarasi parameter sebagai '' array of type '' harus disesuaikan dengan '' pointer yang memenuhi syarat untuk mengetik '', di mana tipe kualifikasi (jika ada) adalah yang ditentukan dalam derivasi deret tipe [ dan ] . Jika kata kunci static juga muncul dalam derivasi deret deret, maka untuk setiap panggilan ke fungsi, nilai argumen aktual yang sesuai harus menyediakan akses ke elemen pertama dari sebuah array dengan setidaknya sebanyak elemen yang ditentukan. dengan ukuran ekspresi

(C99, §6.7.5.3, ¶7, penekanan ditambahkan)

Ini berarti bahwa ini tidak hanya terbatas pada volatile , tapi const dan restrict juga diperbolehkan (lihat Type qualifiers , §6.7.3 ¶1).

Inti dari hack ini pada dasarnya adalah membiarkan Anda menambahkan tipe kualifikasi to the parameter ( not ke elemen array) dan tetap mempertahankan sintaks array untuk deklarasi tersebut; Tanpa sintaks ini, Anda dipaksa untuk kembali menuliskannya sebagai pointer (yang bermuara pada tetap except for the static case , yang AFAIK tidak memiliki sintaks pointer yang setara).

Saya menduga bahwa idenya sebagian besar membuat sintaks sedikit kurang canggung untuk array multidimensional; mengutip §6.7.5.3 ¶21:

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

Semuanya setara, tapi 2 dan 3 mungkin menunjukkan sedikit lebih baik bahwa ini tidak dimaksudkan hanya sebuah penunjuk, tapi juga sebuah array, dan masih memungkinkan beberapa tempat untuk menempatkan restrict kualifikasi.

Juga, seperti dikatakan di atas, tampaknya tidak ada cara untuk memiliki sesuatu seperti

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

(yang "juga menentukan bahwa argumen yang sesuai dengan yang a dalam panggilan ke f harus merupakan pointer non-null ke yang pertama dari setidaknya tiga array dari 5 ganda", ibidem ) dengan sintaks pointer "biasa".

Tetap saja, saya akan menjauh dari sintaks ini; Ini sangat tidak jelas, jarang digunakan (saya rasa saya tidak perlu menambahkan tipe kualifikasi ke parameter array - sekali lagi, parameter itu sendiri, bukan tipe elemen; restrict adalah satu-satunya use case yang bisa masuk akal) - dan bukan portabel ke C ++ (yang umumnya relevan jika Anda menulis perpustakaan).


HighResolutionMusic.com - Download Hi-Res Songs

1 Martin Garrix

Yottabyte flac

Martin Garrix. 2018. Writer: Martin Garrix.
2 Dyro

Latency flac

Dyro. 2018. Writer: Martin Garrix;Dyro.
3 Martin Garrix

Access flac

Martin Garrix. 2018. Writer: Martin Garrix.
4 Alan Walker

Diamond Heart flac

Alan Walker. 2018. Writer: Alan Walker;Sophia Somajo;Mood Melodies;James Njie;Thomas Troelsen;Kristoffer Haugan;Edvard Normann;Anders Froen;Gunnar Greve;Yann Bargain;Victor Verpillat;Fredrik Borch Olsen.
5 Sia

I'm Still Here flac

Sia. 2018. Writer: Sia.
6 Bradley Cooper

Shallow flac

Bradley Cooper. 2018. Writer: Andrew Wyatt;Anthony Rossomando;Mark Ronson;Lady Gaga.
7 Cardi B

Taki Taki flac

Cardi B. 2018. Writer: Bava;Juan Vasquez;Vicente Saavedra;Jordan Thorpe;DJ Snake;Ozuna;Cardi B;Selena Gomez.
8 Blinders

Breach (Walk Alone) flac

Blinders. 2018. Writer: Dewain Whitmore;Ilsey Juber;Blinders;Martin Garrix.
9 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
10 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
11 Mako

Rise flac

Mako. 2018. Writer: Riot Music Team;Mako;Justin Tranter.
12 Kelsea Ballerini

This Feeling flac

Kelsea Ballerini. 2018. Writer: Andrew Taggart;Alex Pall;Emily Warren.
13 Dewain Whitmore

Burn Out flac

Dewain Whitmore. 2018. Writer: Dewain Whitmore;Ilsey Juber;Emilio Behr;Martijn Garritsen.
14 Avril Lavigne

Head Above Water flac

Avril Lavigne. 2018. Writer: Stephan Moccio;Travis Clark;Avril Lavigne.
15 Lady Gaga

Look What I Found flac

Lady Gaga. 2018. Writer: DJ White Shadow;Nick Monson;Mark Nilan Jr;Lady Gaga.
16 Billie Eilish

When The Party's Over flac

Billie Eilish. 2018. Writer: Billie Eilish;FINNEAS.
17 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
18 Rita Ora

Let You Love Me flac

Rita Ora. 2018. Writer: Rita Ora.
19 Diplo

Electricity flac

Diplo. 2018. Writer: Diplo;Mark Ronson;Picard Brothers;Wynter Gordon;Romy Madley Croft;Florence Welch.
20 Charli XCX

1999 flac

Charli XCX. 2018. Writer: Charli XCX;Troye Sivan;Leland;Oscar Holter;Noonie Bao.

Related questions

Hot questions

Language

Popular Tags