Kodu incelerken aşağıdaki kuralları uygularım:
Daima const
, fonksiyonun işaret ettiği verileri değiştirmediği (veya serbest bırakmadığı) referans olarak geçen fonksiyon parametreleri için kullanın.
int find(const int *data, size_t size, int value);
Her zaman const
bir #define veya enum kullanarak tanımlanabilecek sabitleri kullanın . Derleyici, sonuç olarak verileri salt okunur bellekte (ROM) bulabilir (her ne kadar bağlayıcı gömülü sistemlerde bu amaç için daha iyi bir araç olsa da).
const double PI = 3.14;
Bir fonksiyon prototipinde , const değerini , değer tarafından iletilen bir parametre için
kullanmayın . Bir anlamı yok ve bu yüzden sadece 'gürültü'.
// don't add const to 'value' or 'size'
int find(const int *data, size_t size, const int value);
Uygun olduğunda, const volatile
program tarafından değiştirilemeyen ancak yine de değişebilecek konumlarda kullanın . Donanım kayıtları, buradaki tipik kullanım durumudur, örneğin bir cihaz durumunu yansıtan bir durum kaydı:
const volatile int32_t *DEVICE_STATUS = (int32_t*) 0x100;
Diğer kullanımlar isteğe bağlıdır. Örneğin, fonksiyon uygulaması içindeki bir işleve ilişkin parametreler const olarak işaretlenebilir.
// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)
{
... etc
veya işlev dönüş değerleri veya elde edilen ve ardından asla değişmeyen hesaplamalar:
char *repeat_str(const char *str, size_t n)
{
const size_t len = strlen(str);
const size_t buf_size = 1 + (len * n);
char *buf = malloc(buf_size);
...
Bu kullanım const
sadece değişkeni değiştirmeyeceğinizi gösterir; değişkenlerin nerede veya nerede saklandıklarını değiştirmezler. Derleyici elbette bir değişkenin değişmediğini çözebilir, ancak const
bunu ekleyerek onu uygulamanıza izin verir. Bu, okuyucuya yardımcı olabilir ve bazı güvenlikler ekleyebilir (işlevleriniz büyük bir fark yaratacak kadar büyük veya karmaşık olsa da, muhtemelen başka sorunlarınız olabilir). Düzenleme - örn. iç içe geçmiş halkalar ve birçok uzun veya benzer değişken isimleri içeren 200 satırlı yoğun bir şekilde kodlanmış fonksiyon, belirli değişkenlerin asla değişmeyeceğini bilmek, önemli ölçüde anlamayı kolaylaştırabilir. Bu tür işlevler kötü bir şekilde tasarlanmış veya korunmuştur.
İle ilgili sorunlar const
. Muhtemelen "const zehirlenmesi" terimini duyacaksınız. Bu, const
bir işlev parametresine ekleme yapıldığında 'constness'ın yayılmasına neden olur.
Düzenleme - const zehirlenmesi: örneğin fonksiyonunda:
int function_a(char * str, int n)
{
...
function_b(str);
...
}
biz değiştirirseniz str
için const
, biz o zaman sağlamalıdır fuction_b
de alır const
. Ve böylece eğer function_b
geçerse str
üzerine function_c
birçok ayrı dosyalar / modüller içine yayar eğer bu acı olabilir Tahmin edebileceğiniz gibi, vb. Değiştirilemeyecek bir işleve yayılırsa (örneğin bir sistem kütüphanesi), o zaman alçıya ihtiyaç vardır. Bu yüzden const
mevcut kodun etrafına serpmek
belki sorun istiyor. Yine de yeni kodda, const
uygun olan yerlerde tutarlı bir şekilde nitelendirmek en iyisidir .
Daha sinsi olan sorun const
, asıl dilde olmamasıdır. Bir eklenti olarak tam olarak uymuyor. Başlangıç için iki anlamı vardır (yukarıdaki kurallarda olduğu gibi, "Bunu değiştirmeyeceğim" ve "bu değiştirilemez" anlamına gelir). Fakat bundan daha fazlası tehlikeli olabilir. Örneğin, bu kodu derleyin ve çalıştırın ve (derleyiciye / seçeneklere bağlı olarak) çalıştırıldığında kilitlenebilir:
const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';
strchr
bir char*
değil döndürür const char*
. Çağrı parametresi olduğu için
const
o olmalıdır döküm çağrı parametresi char*
. Ve bu durumda, gerçek salt okunur depolama özelliğini atıyor. Düzenleme: - bu genellikle salt okunur hafızadaki değişkenler için geçerlidir. 'ROM' ile, sadece fiziksel ROM değil, tipik bir işletim sistemi üzerinde çalışan programların kod bölümünde olduğu gibi yazmaya karşı korumalı olan herhangi bir belleği kastediyorum.
Birçok standart kütüphane işlevi aynı şekilde davranır, bu yüzden dikkat edin: gerçek sabitleriniz olduğunda (yani, ROM'da saklanır), tutarlılıklarını kaybetmemek için çok dikkatli olmalısınız.
Specific issues with software development
. Ben oldukça spesifik oluyorum.