2016-08-03 7 views
-2

ロギングシステムを記述していて、モジュール内に配列を格納して変更したいのですが(適切な名前のヘッダファイルfoo.hを付けてfoo.cとしましょう)、メインのコンテンツにアクセスできますfoo.cのでは私が持っている:があるC内の別のモジュールでextern配列を宣言する

unsigned char log[4096] = {0}; 

main.cのながら、次のようにエラーが生じ

#include "foo.h" 
int main(){ 
    extern unsigned char log[4096]; 

    // code 

    return 0 
} 

error: 'log' redeclared as different kind of symbol

が、私はこの権利をしています?私はexternログを "log []"と "log"と宣言しようとしましたが、どちらも有用ではありませんでした。この問題に関する少しの啓発が役立つだろう。ありがとうございました!

+0

変数が定義されているファイルとそれを使用するファイル(ヘッダーには 'foo.h'、ヘッダーには' foo.h'、 'main.c'がどこで使用されているかについて定義されています)。これにより、必要なクロスチェックが可能になります。通常のCソースファイルに 'extern'を書き込むべきではありません。ヘッダーにのみ表示する必要があります。 'extern 'と書かなければならないと思うところでは、あなたが使っているはずのヘッダーを使用していないか、ヘッダーが不完全であることを意味します。どちらも長期的なメンテナンスの問題につながります。 –

+0

ヘッダーに変数を宣言しません。すべてのCファイルに、コンパイラがその変数を配置するヘッダをインクルードします。開発者がヘッダーにグローバル変数を宣言し、ヘッダーが2つの異なるCファイルで使用されたため、私はoldwrプロジェクトで非常に厄介なバグを起こしました。 – Sitram

答えて

2

問題はthe log functionから<math.h>です。最も簡単な解決策は、配列の名前を変更することです。

+0

だからこそ、それは私にそれが関数であることを伝え続けました...とてもありがとう、そして迅速な対応のためにありがとう!そのような簡単な解決策。 – Justin

+1

前に名前の衝突に噛まれた人はあなただけではありません。エラーメッセージ "*が実際に何を言おうとしているのか... *"を学ぶ確かな方法です。 –

0

logがグローバル変数であるため、extern宣言をmainの外に移動してみてください。

キーワードexternは、シンボルが別のモジュールで宣言されているため、基本的にエラーを吐き出さないようにコンパイラに指示します。リンク時にシンボルが見つからない場合は、エラーが発生します。

関連する問題