Saya ingin membuat array statis konstan untuk digunakan di seluruh file implementasi Objective-C saya mirip dengan sesuatu seperti ini di tingkat atas file ".m" saya:
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
Saya berencana untuk menggunakannya NUM_TYPES
nanti di file jadi saya ingin memasukkannya ke dalam variabel.
Namun, ketika saya melakukan ini, saya mendapatkan kesalahan
"'Jenis' yang dimodifikasi secara bervariasi pada cakupan file"
Saya mengumpulkan bahwa ini mungkin ada hubungannya dengan ukuran array menjadi variabel (saya tidak mendapatkan pesan ini ketika saya meletakkan literal integer di sana, seperti static int types[4]
).
Saya ingin memperbaikinya, tetapi mungkin saya melakukan semuanya dengan salah ... Saya punya 2 tujuan di sini:
- Untuk memiliki sebuah array yang dapat diakses di seluruh file
- Untuk mengenkapsulasi
NUM_TYPES
menjadi variabel sehingga saya tidak memiliki literal yang sama yang tersebar di berbagai tempat di file saya
Ada saran?
[EDIT] Temukan ini di C Faq: http://c-faq.com/ansi/constasconst.html
#define kNUM_TYPES 4
?@"An NSString literal"
) Satu-satunya hal yang salah dengan potongan kode Anda adalah bahwa tidak perlu titik koma.Jawaban:
Alasan peringatan ini adalah bahwa const dalam c tidak berarti konstan. Artinya "hanya baca". Jadi nilainya disimpan di alamat memori dan berpotensi dapat diubah oleh kode mesin.
sumber
const
(seperti dengan membuangconst
penunjuk dan menyimpan nilai) adalah perilaku yang tidak ditentukan; oleh karena itu, nilai objek semacam itu adalah waktu kompilasi atau konstanta run-time (bergantung pada durasi penyimpanan). Nilai tidak dapat digunakan dalam ekspresi konstan hanya karena standar C tidak menyatakan dapat. (Membuangconst
dan menyimpan nilai diizinkan jika objek tujuan ditentukan tanpaconst
atau dialokasikan secara dinamis; string literal tidakconst
tetapi tidak boleh ditulis.)extern
konstanta di TU berbeda yang nilainya tidak diketahui saat menyusun TU saat ini.Jika Anda tetap akan menggunakan preprocessor, seperti jawaban lainnya, maka Anda dapat membuat compiler menentukan nilai secara
NUM_TYPES
otomatis:#define NUM_TYPES (sizeof types / sizeof types[0]) static int types[] = { 1, 2, 3, 4 };
sumber
sizeof
objek seperti itu adalah konstanta waktu kompilasi.#define NUM_TYPES 4
sumber
Dimungkinkan juga untuk menggunakan pencacahan.
typedef enum { typeNo1 = 1, typeNo2, typeNo3, typeNo4, NumOfTypes = typeNo4 } TypeOfSomething;
sumber
Seperti yang sudah dijelaskan di jawaban lain,
const
di C hanya berarti variabel read-only. Ini masih merupakan nilai run-time. Namun, Anda dapat menggunakanenum
konstanta nyata di C:enum { NUM_TYPES = 4 }; static int types[NUM_TYPES] = { 1, 2, 3, 4 };
sumber
Imho ini adalah cacat di banyak kompiler c. Saya tahu pasti bahwa kompiler saya bekerja dengan tidak menyimpan variabel "konstanta statis" di alamat tetapi mengganti penggunaan dalam kode dengan sangat konstan. Ini dapat diverifikasi karena Anda akan mendapatkan checksum yang sama untuk kode yang dihasilkan saat Anda menggunakan arahan preprocessor #define dan saat Anda menggunakan variabel konstanta statis.
Anda harus menggunakan variabel konstanta statis daripada #defines jika memungkinkan karena konstanta statis bertipe aman.
sumber
static const
variabel. Perilaku yang Anda gambarkan mungkin merupakan pengoptimalan yang valid, tetapi itu jelas bukan sesuatu yang selalu berhasil.