bugfix> c++ > 投稿

たとえば、以下の行はgccでokをコンパイルします。

float *m = calloc(rows*cols, sizeof(float));

しかし、g ++は以下のようにポインタ型の不一致について文句を言います。

../../../../../YOLO/darknet/src/gemm.c:33:22: error: invalid conversion from ‘void*’ to ‘float*

(たぶん、callcは常にc ++でvoid *を返しますか?)
このポインタ型の不一致エラーをg ++に無視させることはできますか? (私はこれを見つけましたリンク しかし、彼らはそれが避けられないと言います。これをどこでも修正せずに、c ++コード内からcコードを使用できるとしたら、それは素晴らしいことです。)

回答 3 件
  • この問題の解決策は、実際には追加しないことです static_cast eerorikaが示唆しているように、CコードをCコンパイラでコンパイルします。 CとC ++の間には、予期しない結果につながる可能性のある微妙な違いがいくつかあり、コンパイラーはそれらすべてをキャッチしません。したがって、すべてのタイプの警告を変更しても、コードが壊れてしまう可能性があります。

    C ++からCコードを呼び出せるようにするには、コードを次のようにマークする必要があります。 extern "C" 次のようなCヘッダー内:

    #ifdef __cplusplus
    extern "C" {
    #endif
    [your definitions]
    #ifdef __cplusplus
    }
    #endif
    
    

  • (maybe callc always returns void* in c++?)

    はい。 calloc 常に戻ります void* 。 CとC ++の両方。

    Can I make g++ just ignore this pointer type mismatch error?

    コンパイラにバグを無視させるのではなく、プログラムを修正することをお勧めします。次のように修正できます。

    float *m = static_cast<float*>(std::calloc(rows*cols, sizeof(float)));
    
    

    または、Cで記述されている場合は、Cコンパイラを使用して変換ユニットをコンパイルします。

    If we can use c code from inside c++

    解決策:ある言語を別の言語内で使用しないでください。 CをCで、C ++をC ++で記述します。言語間の相互作用は、翻訳ユニットをリンクすることで可能になります。

  • C ++については、ドラフト標準n3337または新しいn4860ドラフトを読むか、ISO(またはお住まいの国の同等の標準化組織)から公式標準を購入してください。

    Cについては、ドラフト標準n1570を読むか、ISOから公式標準を購入してください。

    CとC ++の両方については、このWebサイトも参照してください。

    これも読んでくださいモダンCCについての本、そしてそれプログラミング-C ++を使用した原則と実践C ++に関する本。

    最近のGCCを使用していて、そのプラグインのコーディングが許可されている場合は、条件付きでソースコードを修正するプラグインをコーディングするか、お気に入りのエディター(GNU emacsなど)に修正を提案して送信することができます。このようなアプローチには、何週間もの労力がかかる可能性があります。

    この答えが正しく説明しているように、ソースコードを改善する必要があります。

    PS。私はたまたまそのようなGCCプラグインを書くことができます(CHARIOT Europeanプロジェクトによって資金提供されたこのドラフト技術レポートを参照してください)が、そうするために資金を得る必要があります。メールでお気軽にご連絡ください。

あなたの答え