2016-04-08 10 views
2

C++アプリケーション内から開発環境(Keil uVision)でC関数名を表示させる必要があります。残念なことに、表示されている名前にはまだC++のmanglingが使用されています。したがって、Task1を表示する代わりに、_Z5Task1Pvと表示されます。 CではC++でのCの使用

++私は、Cファイルで、私は

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

を持って

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

を呼び出すには、C++アプリケーションで純粋なC名を取得することが可能ですか?

+1

私はその後cppアプリケーションをコンパイルする

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

を持っているドライバ関数を呼び出したい各cppクラスの最上部にこの '(\ *)'は何ですか? –

+6

Cファイルに 'extern" C "'がある場合は、何か非常に間違っています。 – hvd

+1

@EdHeal私は、OPがMarkdownでテキストを太字にするのを避けるために '\ *'を使うことができると気づくでしょう。そして、エスケープが必要なくなったところでコードとして表示されるようにインデントしているだけです。 – hvd

答えて

1

コメントで言うように、extern "C" {...}は、名前マングリング(または少なくともC++ネームマングリング)を防ぐために、C++コンパイラによって使用されます。私は現在、ユーザスペース "ドライバ"をC言語で書かれたC++アプリケーションと静的にリンクするC++アプリケーションを持っています。私はgccを使ってMyCDriver.oファイルを作成してから、g ++を使ってドライバの中にcppのアプリケーションとリンクを作ります。ヘッダファイルにこのよう

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

ここでの典型的なパターンは 'extern" C "を' #ifdef __cplusplus'で囲まれたヘッダーにまっすぐに置くことです。 –

+0

@MatteoItaliaそれは正しいですが、私はそのパラダイムが好きではありません。私は 'c'と' C++ 'コードを分けています。 'c'は' C++ 'の概念を持たず、そうでなければなりません。 'C++ 'が' c'コードを使用したい場合、インクルード/互換性の負担は 'C++'コードに任せてください。もし10年後に新しい 'c + 2'言語が登場すれば、' #ifdef __cplustwo'ガードを私の 'c'コードに追加するだけでいいのですか?さらに、私の 'C++ 'コードで' #include'を見て、 'C++'と 'c ''が 'extern" C /とにかく – yano

1

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