, aşağıda hattı vardır kod rastlamak karıştı?extern extern ve statik konusunda okuduktan sonra "C" static void * işlevi
cevap
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.
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? –
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". –
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 .... –
- 1. extern "Statik geri çağırma fonksiyonu için" C "
- 2. C++ extern eşittir C#
- 3. "extern const" ile "extern" sadece
- 4. Rust'ta extern fn ve extern "C" fn arasındaki fark nedir?
- 5. extern enum
- 6. C++: extern ve satır içi işlevler
- 7. Bu extern "C" nin nasıl algılandığı
- 8. "FOUNDATION_EXPORT" vs "extern"
- 9. extern değişkeni - neden?
- 10. C++: Extern C Bir Ad Alanı İçindeki İşlevler
- 11. int * const AND extern int *
- 12. Başka bir dosyadan C++ extern "C" değişkenine erişme
- 13. MSVC6, extern "C" işlevlerinin istisnalarını nasıl ele alabilir?
- 14. extern NSString, Swift 2.2'den beri erişilemiyor
- 15. C de değişken için extern ihmal, ama hala çalışır?
- 16. C# kelimesinde extern alias anahtar sözcüğünü ne zaman kullanmalıyız?
- 17. ImportError: Extern adında bir modül yok
- 18. Dosyayı okuduktan sonra otomatik olarak kaydedemiyorum. C#
- 19. Tek bir işlev (bsearch/qsort) için extern C AND C++'nin amacı nedir?
- 20. extern değişkeni çok tanımlı bir hataya neden oluyor
- 21. cpp-statik üyesi ve işlevi
- 22. Boyutu extern const olarak bildirilmiş bir dizi bildirme
- 23. hiçbir UnicodeError okuduktan sonra ASCII
- 24. C++ C işlevi nasıl çağrılır?
- 25. Değişken olarak tanımlanmış, ancak extern olarak tanımlandığında uyarı veya hata göstergesi yok
- 26. C++ Statik üye işaretçisi işlevi - nasıl başlatılır?
- 27. statik dizi sınıf değişkeni "çoklu tanım" C++
- 28. static NSMutableDictionary
- 29. C# Kodundan delphi DLL işlevi çağırma
- 30. Kıvılcım: Repartition strateji metin dosyasını okuduktan sonra
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) {'. –
muhtemelen bu hiç bir zaman derlenmiş bir dosyada –
gcc-5.1 derlemeyecektir [bu] (http://ideone.com/15OaqR) – PcAF