Örnek: __attribute__ ((<attribute-name>))
veya __attribute__ ((<attribute-name> (<attribute-options>)))
: Tüm özellikler için
// Declaration:
int square (int x) __attribute__ ((const));
// Definition:
int __attribute__ ((const)) square (int x)
{
return x*x;
}
sözdizimi hemen hemen aynıdır. Bağlan belgelerin alıntılanması:
__attribute__
anahtar kelimesi, bir bildirim yaparken özel öznitelikleri belirtmenize izin verir. Bu anahtar kelimeyi çift parantez içinde bir özellik belirtimi takip eder.
pure
içinde bazı diğer özellikler için bağlantı veren belgelerinde örneği vardır:
int square (int) __attribute__ ((pure));
yüzden tek const
kullanmak, sözdizimi-bilge ihtiyaç pure
değiştirmektir const
için:
int square (int) __attribute__ ((const));
olarak Açıklamalarda belirttiği:
int square (int) __attribute__ ((const)) { ... } // doesn't work
int __attribute__ ((const)) square (int) { ... } // does work
ama const
ve pure
nitelikleri hemen hemen sadece yararlıdır: Bir tanımında kullandığınız eğer, o zaman farklı bir konumda __attribute__ ((const))
koymak gerekir dış beyanlara uygulanırlarsa, bu bir sorun olmamalıdır. Tanım görünürse, GCC, genellikle, sizin yardımınız olmadan fonksiyonun const
/pure
olarak değerlendirilip değerlendirilemeyeceğini belirleyebilir.
Evet, belgeler biraz yanıltıcı, bence: bir işlevin saf olup olmadığı, ne yaptığına bağlı değil. Eğer bir fonksiyon global değişkenleri okuyor olsa da (örneğin, bu değişkenler asla değişmediği için) saf ise, o zaman saf olarak ilan edilebilir. Bu nedenle, derleyici özniteliği zorlayamaz. – hvd
Düzenlemeyle hala mantıklı: int (void) __attribute __ ((pure)); int pure (void) {statik bool pureInited = false; statik int pureValue; if (! pureInited) {pureValue = ...; pureInited = true; geri dönüş pureValue; } 'Fonksiyonun statik depolama süresi ile değişkenleri değiştirmesine rağmen,' pure' özniteliğinin burada uygulanabileceğini düşünüyorum: efekt yine de fonksiyonun her zaman aynı değeri döndürmesidir. ('const ',' pure' yerine, burada da mantıklı olabilir.) – hvd
@hvd, Bu işlev, her bir çağrıda aynı argümanlarla farklı değerler döndürürse, derleyicinin bağıracağını düşünüyor musunuz? – merlin2011