2016-07-18 21 views
6

, aşağıda hattı vardır kod rastlamak karıştı?extern extern ve statik konusunda okuduktan sonra "C" static void * işlevi

+0

Meraklı: Hangi platformda hangi derleyici? İşlev gövdesinin derlenemeyeceğini unutmayın ('foo1 (int * a);' geçersiz C++ 'dır). Mac OS X 10.11.6 üzerinde G ++ 6.1.0 ile derlendiğinde, komut satırını kullanarak bust-cpp.cpp' kaynak dosyasından: g ++ -O3 -g -I./inc -std = C++ 11 -Wall -Wextra -Werror -c bust-cpp.cpp' Mesajları alıyorum: 'bust-cpp.cpp: 1: 12: hata: bağlantı belirtiminde 'statik' geçersiz kullanımı ' ' extern "C" statik void * işaret foo (int * a) {'. –

+0

muhtemelen bu hiç bir zaman derlenmiş bir dosyada –

+0

gcc-5.1 derlemeyecektir [bu] (http://ideone.com/15OaqR) – PcAF

cevap

2

aşağıdaki derler ve hat yapmaya çalışıyor ne yapacağını görünüyor:

extern "C" { 
    static void* foo(int* a){ 
    return foo1(int* a); 
    } 
} 

emin değilim kimse olsa da, bu neden isteyeyim.

"Statik", foo() öğesinin yalnızca dosya kapsamında kullanılabileceği anlamına gelir.

'Statik' C '', dışa aktarıldığında/verildiğinde linker tarafından kullanılan fonksiyonun ismini etkiler, böylece tüm program bağlandığında fonksiyon diğer nesne dosyalarından çağrılabilir. Genellikle, bu, foo() öğesinin tanımlandığı C kaynağından oluşturulmuş veya foo() öğesini tanımlamak istediğiniz nesne dosyasına bağlantı kurmak istediğinizde kullanılır, böylece C'den bir nesne yapısı tarafından kullanılabilir.

"Statik", foo() 'nın 'a gönderilmesine neden olmamasına rağmen ... her ikisi de "yardımcı" olduklarını görmek zor.

Ben ile gelip tek şey foo() birisi bir nesne dosyası içinden öylesine bir foo() anlamını denemek ve geçersiz karar bir test programı için olacağını şöyle bildirilebilir neden için farklı bir dosya göz ardı edilir.

+1

Extern/static işlevinin sebebinin, bir C geri çağırma isteyen bir işaretçiyi göstermesi gerektiğine eminim. Kesin bir ifadeyle, pratikte çalışsa bile C callable işlevine ihtiyaç duyan bir şeye C++ bağlantı ile bir işleve bir işaretçi aktarmak için geçerli değildir. Genellikle eski bir eski 'extern' C 'işlevi kullanılır, ancak neden sadece bir işaretçi istediğiniz bir şey için global ad alanı dağınık? –

+1

Aslında, C++ 11 standardı “extern” C kullanır ({statik void f4(); } "7.5" Bağlantı özellikleri "örneğinde. Ekte yer alan yorumda, "f4 işlevinin adı iç bağlantıya (C dili bağlantısı değil) ve işlevin türü C dili bağlantısına sahiptir". –

+0

Sadece "statik" yapmak, foo() öğesini global ad alanının dışında tutmak için yeterli olmalıdır. Bir "C" bağlantı işlevini * C++ kodu için bir işaretçi * olarak değiştirememe veya tam tersi bir bit tuhaf görünüyor. Bağlantı, * isimlendirmesiyle ilgilidir. Imlecin çalışması fiziksel adreslerle ilgilidir. Ortogonal fikirler gibi görünüyorlar. Sonra tekrar, bir avukat olarak günlerim geçmişte kaldı, yani .... –

İlgili konular