54


35

ヘッダファイル中の変数宣言

私がいくつかの情報源で使われるかもしれない変数を持っている場合 - それはヘッダでそれを宣言するのは良い習慣でしょうか? それとも .c`ファイルで宣言し、他のファイルでは extern`を使うほうが良いでしょうか。

5 Answer


94


ヘッダファイルで変数を宣言する必要があります。

extern int x;

それから_one_Cファイルでそれを定義します。

int x;

Cでは、定義と宣言の違いは、定義が変数のためのスペースを予約するのに対して、宣言は単に変数をシンボルテーブルに導入するだけです(そして、リンク時にはリンカがそれを探しに行きます)。 。


32


ヘッダファイルの中でそれを `extern`として宣言し、それをちょうど1つの.cファイルの中で定義することができます(するべきです)。

cファイルもヘッダーを使用し、標準パターンは次のようになります。
// file.h
extern int x;  // declaration

// file.c
#include "file.h"
int x = 1;    // definition and re-declaration


10


あなたがそれを好きなら宣言すれば

int x;

複数の場所にインクルードされているヘッダファイルでは、xの複数のインスタンス(そしてコンパイルやリンクの問題を引き起こす可能性があります)になります。

これにアプローチする正しい方法は、ヘッダーファイルに次のように言わせることです。

extern int x; / * foo.cで宣言されています* /

そしてfoo.cであなたは言うことができる

int x; / * foo.hにエクスポートされた* /

あなたが好きなだけ多くの場所にあなたのヘッダファイルを含めることができます。


3


重要なのは、ヘッダファイルとソースファイルの変数の宣言を同じにすることです。

私はこのトリックを使います

------ sample.c ------ #define sample_c #include sample.h

(サンプルの残り.c)

------ sample.h ------ #ifdef sample_c #define EXTERN #else #define EXTERN extern #endif

EXTERN int x;

Sample.cは一度だけコンパイルされ、変数を定義します。 sample.hを含むファイルには、変数の "extern"だけが与えられます。その変数にスペースを割り当てます。

あなたがxのタイプを変えるとき、それは皆のために変わるでしょう。 ソースファイルとヘッダーファイルで変更することを忘れないでください。


-1


この解決策はどうですか?

#ifndef VERSION_H #define VERSION_H

static const char SVER [] = "14.2.1"; static const char AVER [] = "1.1.0.0";

#その他

extern static const char SVER []; extern static const char AVER [];

#endif / * VERSION_H * /

唯一の欠点は、同じファイルに2回含めるとインクルードガードがあなたを救わないことです。