Neden't ben bir sınıfta olmayan integral statik, sabit bir üye olabilir mi?
C aşağıdaki derlenir değil fark ettim:
class No_Good {
static double const d = 1.0;
};
Ancak mutlu çift int, işaretsiz, ya da herhangi bir tamsayı türü için değişen bir varyasyon sağlar:
class Happy_Times {
static unsigned const u = 1;
};
Benim çözüm okumak değiştirmek için:
class Now_Good {
static double d() { return 1.0; }
};
ve derleyici gerektiğinde satır içi kadar zeki olduğunu düşünüyorum... ama beni merak bıraktı.
Neden C tasarımcısı(ler) statik sabit bir int veya imzasız, bana izin ver ama bir çift değil ki?
Edit: visual studio 7.1 kullanıyorum (.2003 net) Windows XP.
Edit2:
Soru yanıtlandı, ama tamamlanması için, hata görüyordum:
error C2864: 'd' : only const static integral data members can be initialized inside a class or struct
CEVAP
Sorun bir tamsayı, derleyici ilegenellikleşimdiye kadar sürekli. bir bellek adresi oluşturmak zorunda değil Zamanında öyle bir yer yok, her çevre koduna inlined alır. Eğer hala adresini hiç alınırsa bu bellek bir yer vermeye karar verebilir (ya da eğer bir fonksiyonun sabit başvuru tarafından geçirilen ise) gerekir. Bu adresi vermek için, bazı çeviri birimi olarak tanımlanmış olması gerekiyor. Ve bu durumda, aksi takdirde birden fazla çeviri birimleri olarak tanımlanan alacağı beri tanımından bildirimi ayrı.
Hayır optimizasyonu (-O0
) g kullanarak, otomatik olarak sabit bir tamsayı değişken ama sabit çift değerleri inlines. Yüksek optimizasyon seviyeleri (örneğin -O1
) sabit, çiftler bu inlines. Böylece, aşağıdaki kodu -O0
-O1
ama DEĞİL derler:
// File a.h
class X
{
public:
static const double d = 1.0;
};
void foo(void);
// File a.cc
#include <stdio.h>
#include "a.h"
int main(void)
{
foo();
printf("%g\n", X::d);
return 0;
}
// File b.cc
#include <stdio.h>
#include "a.h"
void foo(void)
{
printf("foo: %g\n", X::d);
}
Komut satırı:
g a.cc b.cc -O0 -o a # Linker error: ld: undefined symbols: X::d
g a.cc b.cc -O1 -o a # Succeeds
Maksimum taşınabilirlik için, başlık dosyaları içinde sabitler bildirmek ve bazı kaynak bir dosya tanımlamak gerekir. Hiçbir iyileştirme, bu olmaz zarar performansı, siz olmadığınıza göre optimize neyse, ama en iyi duruma getirme etkin, bu zarar performansı, yana derleyici artık satır içi bu sabitler diğer kaynak dosyaları, sürece etkinleştir "tüm programı en iyi duruma getirme".
Neden't olmayan sabit başlatılama...
Neden't statik yöntemler Java'da ...
Neden' (statik olmayan) iç bir sı...
Neden't numaralama'in erişim...
performSelector onun seçici bilinmiyor...