1

Cプログラムの複数のファイルで使用する文字列定数を定義したいと考えています。現在、私はそれらを次の形式で持っています:

file.h
#ifndef FILE_H_
#define FILE_H_

  static const char *id = "ID"

#endif

ただし、この文字列を複数のファイルで使用していますが、この変数が使用されていないというコンパイラ警告が表示されます。static キーワードを削除すると、変数に複数の定義があるというエラーが表示されます。

どうすればこれを修正できますか?

4

4 に答える 4

2

(a) それらをプリプロセッサ マクロとして定義する#define ID "ID"(おそらく厄介) か、(b) 1 つのソース ファイルでそれらを定義しextern、ヘッダー ファイルで宣言します。

ヘッダーで静的変数を呼び出すと、それらがすべてのコンパイル単位に表示されるため、望ましくありません。

于 2012-09-28T03:05:26.620 に答える
1

ヘッダー ファイルで変数を定義して、それを複数のソース ファイルに含めないでください。
非静的変数の場合One定義ルールに違反し、リンカーは文句を言います。

ヘッダーで aを定義するstaticと、ファイルをインクルードする各翻訳単位の変数のコピーが得られます。これは、1 つの変数を複数のファイルで共有するという要件を満たしません。

問題を解決するには、次の 2 つの方法があります。


定数文字列として使用する場合は、マクロを使用するだけです

#define ID "ID"  

そして、マクロ定義をどこで使用しても見えるようにしてください


複数のファイルで vairable として使用する場合は、単純にextern.

file.h

extern const char *id;

file2.cpp

#include"file.h"

const char *id = "ID";

file3.cpp

#include"file.h"

//Use the variable
于 2012-09-28T03:05:43.103 に答える
0

私はマクロを使用します-そのヘッダーファイルを含むファイルはそれを「定数」として持ちます(実際にはコンパイルのプリプロセッサ段階で置き換えられます):

#define ID "ID"
于 2012-09-28T03:07:48.503 に答える
0

少なくとも GCC は、静的な非ポインター定数について警告しません。

static const char id[] = "ID";

あなたのバージョンの問題は、文字列リテラルを作成し、それへのポインタを「捨てる」ことです。

于 2012-09-28T03:05:50.657 に答える