2016-04-08 36 views
2

Bir C++ uygulaması içinden C işlev adlarını bir geliştirme ortamında (Keil uVision) görünmesi gerekir. Maalesef görüntülenen isimler hala C++ ad mangling kullanıyor. Dolayısıyla, Task1 görüntüleniyorsa, sistem _Z5Task1Pv görüntüler. CC++ içinde C adlarını kullanma

++ bir C++ uygulamasında saf C adlarını almak için ben

extern "C" { 
    ... 
    typedef void (*TaskFct)(void*); 
    ... 
    static void Task1(void* param) { ... } 
    ... 
    static TaskFct getTaskID(TaskFct tFunc) { 
    ... 
    return Task1; 
    } 
} 

sahip bir C dosyasında

{ 
... 
threadDef->pthread = (void (*)(void const*))getTaskID(tfunc); 
... 
threadId = osThreadCreate(threadDef, param); 
} 

sonra mümkün mü diyoruz?

+1

Ben sürücü işlevleri çağırmak istediğiniz her cpp sınıfının en azından ben Sonra

extern "C" { #include "MyCDriverHeader.h" } 

cpp uygulamaları derlemek zorunda Bu nedir? (\ *) '? –

+6

Bir C dosyasında extern "C" 'varsa, çok yanlış bir şey yapıyorsunuz demektir. – hvd

+1

@EdHeal OP'nin, Markdown'da kalın bir metin oluşturulmasını önlemek için kullanılabileceğini ve ancak kaçmanın artık gerekli olmadığı bir kod olarak gösterilmesini sağlamak için bunu girintili olduğunu fark ettiğini tahmin edeceğim. – hvd

cevap

1

Yorumlar olarak, extern "C" {...}, ad manggling (veya en az C++ ad manelling) önlemek için bir C++ derleyici tarafından kullanılır. Ben şu anda c bir kullanıcı alanı "sürücüsü" ve statik olarak bağlamak C++ uygulamalar bir avuç var bir kurulum var. Ben MyCDriver.o dosyayı oluşturmak için gcc, daha sonra g ++ cpp uygulamalar ve sürücüdeki bağlantı oluşturmak için kullanın. başlık dosyasında bu gibi

g++ -o MyCppApp MyCppApp.cpp MyCDriver.o 
+0

Buradaki tipik desen, "#ifdef __cplusplus" ile kapsanan başlığa "extern" C "'ye sahip olmaktır. –

+0

@MatteoItalia bu doğru, ancak, ben bu paradigma sevmiyorum. "C" ve "C++" kodlarımı ayrı tutuyorum. 'c'' C++ 'kavramına sahip değildir, ne de olmalıdır. Eğer C++ 'c' kodunu kullanmak istiyorsa, içerme/uyumluluk yükü' C++ 'koduna bırakılmalıdır. Ya şimdi yeni bir 'c + 2' dili 10 yıl sonra çıkacaksa, şimdi hazır olmak için 'c' koduma' #ifdef __cplustwo' korumalarını eklemem gerekir mi? Üstelik 'C++' kodumdaki '' include's'ma bakabilirim ve 'C++''nın ne olduğunu ve' c '' extern 'C' 'w/o açılış başlık dosyalarını temel alarak ne olduğunu bilirim .. benim azınlık düşüncem neyse. – yano

1

:

#ifdef __cplusplus 
    extern "C" { 
#endif 
... 
#ifdef __cplusplus 
    } 
#endif