2016-05-02 9 views
1

私はC言語で書かれたアプリケーションを持っています。私はC++で追加する必要がある新しい機能です。私はGCCを使ってCアプリケーションをビルドします。 G ++で既存のアプリケーションを構築するにはC++コンパイラによるCアプリケーションのビルド

  1. :新しい機能を追加するには 。

  2. 新しい機能を追加します。私は(1)を実行しようとしました

、私は次のような問題に会った: ファイルdev_table.cで定義された配列:ファイルstm.cで

const type_name devices[] = {...};

私がすることで、この配列をエクスポートします:

extern const type_name devices[];

そして、私が割り当て

stm->dev = devices;

リンカーが失敗します。

GCCで同じコードをビルドしても、すべて問題なく動作しますが、G ++では失敗します。私は両方の場所(dev_table.cstm.c)からconstを削除した場合

、それは私が理由が何であるかを理解していないにもうまく機能しているので、問題が解決され、けど

+0

以前に取得したエラーは何でしたか? – piyushj

+0

'g ++'でビルドしたときのコマンドラインは何ですか?その出力は何ですか? – purplepsycho

+0

C++で配列を割り当てることはできません。 IDKならC言語ではできますが、C++ではできません。もしあなたがそれを必要とするなら、[std :: array](http://en.cppreference.com/w/cpp/container/array)を使うことをお勧めします。 – NathanOliver

答えて

2

私は、あなたがthis post

オムを見てお勧めのconst sが暗黙的に静的なので、あなたも(FILE.C中)a_global_var定義にはexternを必要としています。これがなければ、file.hを含むものは外部リンクを持つconst int a_global_varを探しているのでリンクしません。

それとも

あなたは( externconst)それらを一緒に使用することができます。しかし、C++がデコレーションの名前を付けるとき、シンボル名を修飾するために使用される型情報にconstが含まれているので、constの使用について一貫性を持たせる必要があります。だからextern const int私はextern int以外の変数を参照するだろう。 extern "C" {}を使わない限り。 Cの名前の装飾はconstに注意を払っていません。