2013-02-17 32 views
10

Bir işlevde C içinde static anahtar sözcüğünü kullanmanın, işlevi tanımlandığı derleme birimiyle kısıtladığını biliyorum. Şimdi sembol görünürlüğüne bakıyorum ve static işlevleri ve __attribute__((visibility("hidden"))) ile işaretlenmiş işlev arasındaki veya -fvisibility=hidden komut satırı seçeneğini kullanarak fark hakkında biraz kafam karıştı.Statik işlev ile "gizli" görünürlük özelliği olan bir işlev arasındaki pratik fark nedir?

Bu, kapağın altındaki şeylerin değişme şeklinin tamamen aynı olmadığına dair bir fikrim var, ama gerçek kodda onlarla çalışırken ne farkın ne anlama geldiğini bilmiyorum. İkisi arasında ne değişiyor ve diğerini ne zaman kullanmak istersiniz?

cevap

12

__attribute__((visibility("hidden"))) olan bir fonksiyon bunu içeren ortak kütüphane dışında görünür değildir, ama bu kütüphane bir fonksiyonu fhidfoo.c tanımlandığı gibidir ve bar.c çağrılabilir foo.pic.o ve bar.pic.o bağlanmasıyla yapılmış ise. Tabii ki dış kod (ör., Ana programdan veya başka bir paylaşılan kütüphaneden), bu fhid

Bu yüzden, gizli görünürlük, onu oluşturan bireysel derleme birimlerine değil, tüm paylaşılan kütüphaneye uygulanır. Buna karşılık

foo.c bir static void fsta(void) fonksiyonunu tanımlamak için, mümkün olurdu ve bar.c için (yani zayıf tat ve okunabilirliği nedenleriyle kaçınılmalıdır bile) bir farklıstatic void fsta(void) fonksiyonunu tanımlamak için. Ayrıca, prensip olarak, bir static işlevinin daha kolay bir şekilde belirtilebilmesi veya derleyicinin (bazen) bunun için farklı çağrı kuralları kullanabileceği de olabilir.

+0

dosyasını okuyun, ancak DLL dışından değil +1 –

0

Gizli görüş sembol dinamik simge tablosuna yerleştirilebilir olmaz, bu nedenle başka bir "modül" (çalıştırılabilir veya ortak kitaplığı) doğrudan referans gösterir.

http://ohse.de/uwe/articles/gcc-attributes.html

Ben ekleyebilirsiniz: Sen static ait C'nin versiyonuna yakın semantik ile C++ __attribute__((visibility("hidden"))) kullanabilirsiniz. Paylaşılan bir kitaplıkta bir global işlevi varsa

+0

Tam olarak değil: iki farklı derleme biriminde aynı adı taşıyan iki farklı 'statik 'işlevine sahip olabilirsiniz. Gizli görünürlük ile 2 f işlevine sahip olamazsınız. –

4

Sadece paylaşılan kitaplıkta kapsamında kullanılacak isterdi, ancak paylaşılan kütüphane dışında - o zaman Örneğin __attribute__((visiblity("hidden")))

gerekir:

o zaman

olarak işlev yapabilir sen void foo() Foo.c tanımlanan bir işlevi var ve bunun Bar.c ve FooBarBaz.dll (veya FooBarBaz.so) üretmek için derleme birimlerdir Baz.c dan başvurmak istiyorum olsaydın

Unutmayın, foo(), dll (veya dosyasını yükler.öyleyse) Bu paper

İlgili konular