0

次のようなヘッダーファイルがあります

header.h

int TOS;

このファイルは 1 つのコード ファイルによってインクルードされています

code.c

#include "header.h"
TOS=0;

code.c をコンパイルすると、GCC が警告を発行します。

code.c:3:1: 警告: データ定義に型またはストレージ クラスがありません [デフォルトで有効]

この警告の原因がわかりません。code.c で TOS を宣言して定義するのと同じではありませんか? すなわち

code.c

int TOS;
TOS=0;
4

3 に答える 3

2

これはTOS、グローバル スコープで定義するためです。型を定義する必要がありますTOS(宣言です)。型が指定されていない場合、デフォルトではintです。

これによりconflicting type error

char x;
x = 0;
于 2011-10-09T11:54:23.010 に答える
2

ヘッダー ファイルで変数を転送する正しい方法は次のようになります。

extern int TOS;

externthis がないとTOS、複数のコンパイル単位 (.o ファイル) に割り当てられる可能性があります。

次に、1 つの .c ファイルで次のように定義します。

int TOS;

これにより、そのためのスペースが予約され、グローバルスコープの変数であるため、初期化され0ます。この初期化を明示的にしたい場合、またはそれを 以外の値にしたい場合、(代入ではなく)0初期化の正しい構文は次のとおりです。

int TOS = 54;

現代の C では、どこかから継承したと思われる構文、つまり暗黙的な type を持つグローバル変数の定義は許可されていませんint

于 2011-10-09T12:55:51.920 に答える
0

TOS=0代入ではなく、初期化子を使用した宣言 (つまり、定義) です。int TOS;は、外部リンケージを伴う暫定的な定義です。リンカーが複数の翻訳単位をリンクすると、対応するオブジェクト (変数のメモリ) が折りたたまれます。他の場所で述べたように、 のデフォルトのタイプはint、標準の以降の版には存在しない C89 機能です。

于 2011-10-09T15:23:12.590 に答える