【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18678

グローバル変数定義時のエラー
投稿者---tarot(2004/12/13 18:00:11)


グローバル変数を定義する部分でよく分からないエラーが出まして、
ご説明をお願いしたいと思い書き込みしています。

実際にこのエラーで行き詰まっているのは別のプログラムなのですが、
似た構造の短いコードで同様のエラーが再現できましたので
そちらを掲載したいと思います。

環境はRed Hat Linux 7.2のgcc 2.95.3でコンパイルしています。

def.h
#ifndef INIT_DEFINE
#define INIT_DEFINE

typedef double D;

D init(void);

#endif

test.h
#include "def.h"

extern D aaa;

void test(void);

test.c
#include <stdio.h>
#include "test.h"
#include "def.h"

D aaa;

aaa = init();

void test(void){
  printf("%f", aaa);
}

コンパイル時のエラーメッセージ
% gcc -c test.c -Wall
test.c:7: warning: type defaults to `int' in declaration of `aaa'
test.c:7: conflicting types for `aaa'
test.c:5: previous declaration of `aaa'
test.c:7: initializer element is not constant
test.c:7: warning: data definition has no type or storage class
test.c: In function `test':
test.c:10: warning: double format, different type arg (arg 2)
% 


私の意図としてはtest.hでD型の変数aaaがextern宣言され、
test.cの5行目で変数aaaが定義され、7行目でD型の値を返すinit()によって
値が代入されるという流れなのですが、
コンパイル時のエラーによるとtest.cの5行目が定義とみなされておらず、
7行目が定義であるかのように思われているようです。

ちなみに、関数test()の内部にaaa=init();を移すと
何のエラーも出ずにコンパイルできますが、
関数test()は別の関数から何度も呼ばれ、aaaの値を保持したいので
test()の内部でaaaの初期化init()を行うのではなく外部で初期化を
行いたいと思っています。

何故このようなことが起こるのかご説明いただけませんでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:グローバル変数定義時のエラー 18681 REE 2004/12/13 18:28:37


No.18681

Re:グローバル変数定義時のエラー
投稿者---REE(2004/12/13 18:28:37)


>aaa = init();

関数の外部に実行文をおくことは出来ません。



この投稿にコメントする

削除パスワード

No.18683

Re:グローバル変数定義時のエラー
投稿者---tarot(2004/12/13 19:18:33)


お返事ありがとうございます。


>関数の外部に実行文をおくことは出来ません。

そんな単純な話だったのですね^^;
何故かできるはずと思い込んでいて2時間近くこれで悩んでいました。。。

よく考えると確かにその通りですね。
実際、全ての処理は関数の中で行っているわけで。

本当にどうもありがとうございました。


この投稿にコメントする

削除パスワード

No.18705

Re:グローバル変数定義時のエラー
投稿者---tetrapod(2004/12/14 09:41:06)


C++ なら実行時でないと値の決まらない初期値による初期化ができるので
D aaa=init();
と書けます。この初期化はプログラムのロード後 main() の前に実行されます。
C では初期値はコンパイル時に値が決まらないとダメ。

初期化順に依存するプログラムを書いちゃうとバグるので要注意です。



この投稿にコメントする

削除パスワード

No.18706

Re:グローバル変数定義時のエラー
投稿者---tarot(2004/12/14 13:09:20)


お返事ありがとうございます。


>C++ なら実行時でないと値の決まらない初期値による初期化ができるので

C++ はほとんど知らないのですが、C とはそのような違いもあるのですね。


>C では初期値はコンパイル時に値が決まらないとダメ。

似たような間違いをしないよう、しっかり覚えておこうと思います。


ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧